Symfony4-如何更新一个学说的ArrayCollection?

时间:2018-12-27 22:24:36

标签: php symfony 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();
         }
}

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

如果我还记得的话,当您将一个字段设置为ArrayCollection时,这意味着您在两个实体之间具有oneToMany关系。 从您的代码中,我可以告诉您,您正在尝试将数据持久保存在错误的实体中。通常,您在每个项目(1-to- N )中添加 owning_entity_id 1 -to-N)并保存。在您的代码中,您尝试一次设置所有引用,这永远不会发生。删除setFaavailability()或重新定义实体的关系。

您永远不要尝试在一个super duper setter函数中批量添加外键关系。循环浏览所有项目,并将引用设置为“父”实体。

答案 1 :(得分:0)

问题出在这部分:$faPerson = $em->getRepository(FaPerson::class)->findById($animal->faperson->getId());

findBy*方法将尝试查找多个实体并将其返回到Collection中。 如果您正在寻找一个人,则可以改用findOneById。或者(假设id在Doctrine中被配置为标识符),您甚至可以使用find方法:$faPerson = $em->getRepository(FaPerson::class)->find($animal->faperson->getId());

答案 2 :(得分:0)

一些一般性评论:

  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();