[英]Symfony4 - How to update a doctrine ArrayCollection ?
我的實體成員是arrayCollection。 使用經典的表單生成器可以正常工作時,我可以選擇多個項目並將其保留。 但是,當我嘗試更新控制器中的對象時,出現錯誤:“在數組上調用成員函數setFaavailability()”。
我的實體簡歷:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\FaAvailability",
inversedBy="faavailability")
* @ORM\JoinColumn(nullable=true)
* @ORM\Column(type="array")
*/
public $faavailability;
/**
* @return mixed
*/
public function getFaavailability()
{
return $this->faavailability;
}
/**
* @param mixed $faavailability
*/
public function setFaavailability($faavailability)
{
$this->faavailability = $faavailability;
}
在我的控制者中:
$varFaavailability = $animal->faperson->getFaavailability();
foreach($varFaavailability as $availability){
if($availability->getName() == $animal->typepet->getName()){
$varFaavailability->removeElement($availability);
$faPerson = $em->getRepository(FaPerson::class) >findById($animal->faperson->getId());
$faPerson->setFaavailability($varFaavailability);
$em->persist($faPerson);
$em->flush();
}
}
有任何想法嗎 ?
如果我還記得的話,當您將一個字段設置為ArrayCollection時,這意味着您在兩個實體之間具有oneToMany關系。 從您的代碼中,我可以告訴您,您正在嘗試將數據持久保存在錯誤的實體中。 通常,您在每個項目(1-to-N)中添加owning_entity_id ( 1 -to- N )並將其保留。 在您的代碼中,您嘗試一次設置所有引用,這永遠不會發生。 刪除setFaavailability()或重新定義實體的關系。
您永遠不要嘗試在一個super duper
setter函數中批量添加外鍵關系。 循環瀏覽所有項目,並將引用設置為“父”實體。
問題出在這部分: $faPerson = $em->getRepository(FaPerson::class)->findById($animal->faperson->getId());
findBy*
方法將嘗試查找多個實體並將它們返回到Collection
。 如果您正在尋找一個人,則可以改用findOneById
。 或者(假設id
在Doctrine中被配置為標識符),您甚至可以使用find
方法: $faPerson = $em->getRepository(FaPerson::class)->find($animal->faperson->getId());
一些一般性的評論:
根據我對變量的理解,我將其重命名。 但是我仍然不確定$ animal-> faperson-> getFaavailabilities()會返回什么,因為在開始時您想循環遍歷結果,然后通過setFaavailability()將其設置為單個?
//Should be a Doctrine ArrayCollection
$varFaavailabilities = $animal->faperson->getFaavailabilities();
foreach($varFaavailability as $availability){
if($availability->getName() == $animal->getTypepet()->getName()) {
//Why do you want to remove an element from the current loop?
$varFaavailability->removeElement($availability);
//No need to use Id
$faPerson = $animal->getFaperson();
//A single one?
$faPerson->setFaavailability($availability);
//More than one? addFaavailability should exist.
$faPerson->addFaavailability($availability);
$em->persist($faPerson);
}
}
$em->flush();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.