循环遍历实体并更新它们会导致刷新时出错



我是符号和学说的新手。我正在强制执行一个别人已经启动的代码。我主要有一个表单,我在控制器中为它编写了一个验证函数。在这种形式中,将创建一个BusReservation对象及其BusReservationDetails,并将其保存到数据库中。因此,在表单验证功能的最后,在实体保存到DB中后,我调用BusReservation Manager方法transformBusReservationDetailIntoBusTicket,其目的是获取BusReservations项目中的每个BusReserveDetail,并在此基础上创建一个新的实体BusTicket.

所以我创建了这个循环(如果我的代码中有什么错误,请告诉我,这样我就可以用良好的语法写作(。我试图把你在代码末尾看到的3持久化,但我得到了:注意:未定义的索引:0000000。。我试图合并(代码中的最后3行(我得到了以下内容:

A new entity was found through the relationship 'MyBundleEntityCustomInfo#busTicket' that was not configured to cascade persist operations for entity: . To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

当我评论merge和flush的所有6行时,我也出现了同样的错误。

附言:我不希望冲水完全起作用。有一些属性是nullable=false,所以我认为我也必须设置它们,以便将实体保存到DB中。但我所犯的错误与此大不相同。

PS:我注意到有一个onFlush,其中customInfo被更新并再次持久化,其他事情也发生了,但我正在尝试一步一步地调试。我尝试分离此事件,但仍然出现相同的错误。所以我想修复我的代码,并确保我在管理器中编写的代码部分是正确的,如果是这样的话,那么我可以开始调试事件侦听器。所以我想知道下面的代码是否正确,以及为什么刷新不起作用。


/**
* @param $idBusReservation
* @return bool
* @throws DoctrineORMNonUniqueResultException
*/
public function transformBusReservationIntoBusTicket($idBusReservation): bool
{   $result = "into the function";
/** @var BusReservation $busReservation */
$busReservation = $this->em->getRepository('MyBundle:BusReservation')->find($idBusReservation);
if ($busReservation !== null) {
/** @var BusReservationDetail $busReservationDetail */
foreach ($busReservation->getBusReservationDetails() as $busReservationDetail) {
$busTicket = new BusTicket($busReservationDetail->getBusModel(), $busReservation->getPassenger());
$busReservationDetail->setBusTicket($busTicket);
$busTicket->setBusReservationDetail($busReservationDetail);
$busTicket->setOwner($busreservation->getPassenger()->getName());
if ($busReservationDetail->getBusModel()->getCode() === 'VIPbus') {
//  perform some logic .. later on
} else {
$customInfo = new CustomInfo();
$customInfo->setNumber(1551998);
// $customInfo->setCurrentMode(
//     $this->em->getRepository('MyBundle:Mode')
//         ->find(['code' => 'Working'])
// );
$customInfo->setBusTicket($busTicket);
// Bus ticket :
$busTicket->addCustomInfo($customInfo);
$busTicket->setComment($busReservation->getComment());
}
/** @var Mode $currentMode */
$currentMode = $this->em->getRepository('MyBundle:Mode')
->findOneBy(['code' => 'Working']);
$busTicket->setCurrentMode($currentMode);
// $this->em->merge($customInfo);
// $this->em->merge($busReservationDetail);
// $this->em->merge($busTicket);
// $this->em->persist($customInfo); 
// $this->em->persist($busReservationDetail); 
// $this->em->persist($busTicket); 
}

$this->em->flush();
//  $this->em->clear();
}
return $result;
}
// *************** In BusReservation.php ********************
/**
* @ORMOneToMany(targetEntity="MyBundleEntityBusReservationDetail", mappedBy="busReservation")
*/
private $busReservationDetails;
/**
* Get busReservationDetails
* 
*@return Collection
*/
public function getBusReservationDetails()
{
return $this->busReservationDetails;
}
// ---------------------------------------------------------------------
// *************** In BusReservationDetail.php ********************

/**
* @ORMManyToOne(targetEntity="MyBundleEntityBusReservation", inversedBy="busReservationDetails")
* @ORMJoinColumn(name="id_bus_reservation", referencedColumnName="id_bus_reservation", nullable=false)
*/
private $busReservation;
/**
* @ORMManyToOne(targetEntity="MyBundleEntityBusModel")
* @ORMJoinColumn(name="bus_model_code", referencedColumnName="bus_model_code", nullable=false)
*/
private $busModel;
/**
* @ORMOneToOne(targetEntity="MyBundleEntityBusTicket", inversedBy="busReservationDetail", cascade={"merge","remove","persist"})
* @ORMJoinColumn(name="id_bus_ticket", referencedColumnName="id_bus_ticket")
*/
private $busTicket;
/**
* @return BusModel
*/
public function getBusModel()
{
return $this->busModel;
}
//-------------------------------------------------------------------------
// ************ IN BusTicket.php *****************************
/**
* @ORMOneToMany(targetEntity="MyBundleEntityCustomInfo", mappedBy="busTicket")
*/
private $customInfos;

/**
*
* @param  CustomInfo  $customInfo
*
* @return BusTicket
*/
public function addCustomInfot(CustomInfo $customInfo)
{
if (!$this->customInfos->contains($customInfo)) {
$this->customInfos[] = $customInfo;
}

return $this;
}
/**
* @ORMOneToOne(targetEntity="MyBundleEntitybusReservationDetail", mappedBy="busTicket")
*/
private $busReservationDetail;
// --------------------------------------------------------------------
//   CUSTOMINFO ENTITY
/**
* @ORMManyToOne(targetEntity="MyBundleEntityBusTicket", inversedBy="customInfos")
* @ORMJoinColumn(name="id_bus_ticket", referencedColumnName="id_bus_ticket", nullable=false)
*/
private $busTicket;

答案在错误消息中。您必须将cascade={"persist"}添加到实体注释中,或者显式调用persistent。我认为你不需要他们->merge((,因为您永远不会断章取义。

在你所有的持久行都被注释掉的地方,试着把它放在中

$this->em->persist($busTicket); 
$this->em->persist($busReservationDetail); 
$this->em->persist($customInfo); 

如果你正在循环通过大量的实体,你可以尝试在循环的末尾添加flush,而不是在末尾添加一个巨大的flush。

最新更新