Symfony4 - 如何更新一个学说 ArrayCollection .



我有一个成员的实体是一个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_id1N)并保留它。在您的代码中,您尝试一次设置所有引用,这永远不会发生。删除 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. 在教义中,您永远不必使用 ID。使用实体对象!例如,仅当您从请求参数获取 ID 时,才需要查找 ById。
  2. 您应该重新考虑变量的命名,以明确它是集合 ($availabilities) 还是单个集合 ($availability)。
  3. 始终使用 getter/setter 方法而不是字段(typepet vs getTypepet())。
  4. 最后调用 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();

相关内容

  • 没有找到相关文章

最新更新