我有一个成员的实体是一个arrayCollection。使用经典的表单构建器工作正常,我可以选择多个项目并保留它。但是当我尝试更新控制器中的对象时,我收到错误:"调用数组上的成员函数setFaavailability()"。
我的实体简历:
/**
* @ORMManyToOne(targetEntity="AppEntityFaAvailability",
inversedBy="faavailability")
* @ORMJoinColumn(nullable=true)
* @ORMColumn(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 到 N)中添加 owning_entity_id(1 到 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());
一些一般性评论:
- 在教义中,您永远不必使用 ID。使用实体对象!例如,仅当您从请求参数获取 ID 时,才需要查找 ById。
- 您应该重新考虑变量的命名,以明确它是集合 ($availabilities) 还是单个集合 ($availability)。
- 始终使用 getter/setter 方法而不是字段(typepet vs getTypepet())。
- 最后调用 flush() one 以更新单个事务中的所有实体。
我已经按照我的理解重命名了下面的变量。但是,我仍然不确定$animal->faperson->getFaavailability()返回什么,因为一开始您想循环浏览结果,然后通过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();