我的实体成员是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();
}
}
有什么想法吗?
答案 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)
一些一般性评论:
据我所知,我已将以下变量重命名。但是我仍然不确定$ 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();