我是 symfony 和教義的新手。我正在完成其他人已經開始的代碼。我主要有一個表單,我在控制器中為其撰寫了一個驗證函式。在這種形式中,將創建一個 BusReservation 物件及其 BusReservationDetails 并將其保存到資料庫中。所以在表單驗證功能的最后,物體保存在資料庫中后,我呼叫了一個 BusReservation Manager 方法,即 transformBusReservationDetailIntoBusTicket,其目的是獲取 BusReservation 物件中的每個 BusReservationDetail,并基于它創建一個新的物體 BusTicket。
所以我創建了這個回圈(請讓我知道我的代碼是否有問題,以便我可以用良好的語法撰寫)。我試圖將您在代碼末尾看到的 3 持久化,但我得到: 注意:未定義索引:0000000 .. 我嘗試合并(代碼中的最后 3 行)我得到以下內容:
A new entity was found through the relationship 'MyBundle\Entity\CustomInfo#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"}).
當我評論所有 6 行合并和重繪 時,我得到了同樣的錯誤。
PS:我不指望沖洗能夠完全發揮作用。有一些屬性,nullable=false所以我假設我必須設定它們,以便物體可以保存到資料庫。但我得到的錯誤與此大不相同。
PS:我注意到有一個 onFlush ,其中 customInfo 被更新并再次持久化并且發生了其他事情,但我正在嘗試逐步除錯。我試圖分離此事件,但仍然遇到相同的錯誤。所以我想修復我的代碼并確保我在管理器中撰寫的代碼部分是正確的,如果是這種情況,那么我可以開始除錯事件監聽器。所以請我想知道以下代碼是否正確以及為什么重繪 不起作用。
/**
* @param $idBusReservation
* @return bool
* @throws \Doctrine\ORM\NonUniqueResultException
*/
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 ********************
/**
* @ORM\OneToMany(targetEntity="MyBundle\Entity\BusReservationDetail", mappedBy="busReservation")
*/
private $busReservationDetails;
/**
* Get busReservationDetails
*
*@return Collection
*/
public function getBusReservationDetails()
{
return $this->busReservationDetails;
}
// ---------------------------------------------------------------------
// *************** In BusReservationDetail.php ********************
/**
* @ORM\ManyToOne(targetEntity="MyBundle\Entity\BusReservation", inversedBy="busReservationDetails")
* @ORM\JoinColumn(name="id_bus_reservation", referencedColumnName="id_bus_reservation", nullable=false)
*/
private $busReservation;
/**
* @ORM\ManyToOne(targetEntity="MyBundle\Entity\BusModel")
* @ORM\JoinColumn(name="bus_model_code", referencedColumnName="bus_model_code", nullable=false)
*/
private $busModel;
/**
* @ORM\OneToOne(targetEntity="MyBundle\Entity\BusTicket", inversedBy="busReservationDetail", cascade={"merge","remove","persist"})
* @ORM\JoinColumn(name="id_bus_ticket", referencedColumnName="id_bus_ticket")
*/
private $busTicket;
/**
* @return BusModel
*/
public function getBusModel()
{
return $this->busModel;
}
//-------------------------------------------------------------------------
// ************ IN BusTicket.php *****************************
/**
* @ORM\OneToMany(targetEntity="MyBundle\Entity\CustomInfo", mappedBy="busTicket")
*/
private $customInfos;
/**
*
* @param CustomInfo $customInfo
*
* @return BusTicket
*/
public function addCustomInfot(CustomInfo $customInfo)
{
if (!$this->customInfos->contains($customInfo)) {
$this->customInfos[] = $customInfo;
}
return $this;
}
/**
* @ORM\OneToOne(targetEntity="MyBundle\Entity\busReservationDetail", mappedBy="busTicket")
*/
private $busReservationDetail;
// --------------------------------------------------------------------
// CUSTOMINFO ENTITY
/**
* @ORM\ManyToOne(targetEntity="MyBundle\Entity\BusTicket", inversedBy="customInfos")
* @ORM\JoinColumn(name="id_bus_ticket", referencedColumnName="id_bus_ticket", nullable=false)
*/
private $busTicket;
uj5u.com熱心網友回復:
答案在您的錯誤訊息中。您要么必須添加cascade={"persist"}到物體注釋,要么顯式呼叫persist。我認為在這種情況下您不需要 em->merge() ,因為您永遠不會將物體脫離背景關系。
在您將所有持久行注釋掉的地方,只需嘗試將其放入
$this->em->persist($busTicket);
$this->em->persist($busReservationDetail);
$this->em->persist($customInfo);
如果您要遍歷大量物體,則可以嘗試在最后的回圈內添加重繪 ,而不是在最后添加一個巨大的重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435248.html
