簡體   English   中英

Symfony4-如何更新一個學說的ArrayCollection?

[英]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_id1 -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());

一些一般性的評論:

  1. 在Doctrine中,您無需使用ID。 使用實體對象! 例如,僅當從請求參數獲取ID時,才需要findById。
  2. 您應該重新考慮變量的命名,以使其清楚是集合($ availability)還是單個集合($ availability)。
  3. 始終使用getter / setter方法代替字段(typepet與getTypepet())。
  4. 最后調用flush()一個更新一個事務中的所有實體。

根據我對變量的理解,我將其重命名。 但是我仍然不確定$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM