1

我目前正在处理 Flow3(Doctrine)中“项目”和“人员”之间的第一个多对多关系,并希望从两个控制器中添加、获取和删除元素。

项目申报:

class Project {
 // ...

 /**
  * @var \Doctrine\Common\Collections\Collection</*...*/\Person>
  * @ORM\ManyToMany(targetEntity="/*...*/\Person", mappedBy="projects")
  */
  protected $persons;

 // ... 
}

人员声明:

class Person {
 // ...

 /**
  * @var \Doctrine\Common\Collections\Collection</*...*/\Project>
  * @ORM\ManyToMany(targetEntity="/*...*/\Project", inversedBy="persons")
  */
  protected $projects;

 // ...
}

但我只能在“人”(倒置)一侧添加/删除对象。至少我可以从双方得到对象。我是否真的必须在“项目”方面使用“人员”对象构建解决方法,还是我错过了一个简单的解决方案?

这是 projectController 的代码片段,它不起作用:

public function addpersonAction() {
    $param = $this->request->getArgument('project');
    $project = $this->projectRepository->findByIdentifier($param['__identity']);
    $selectedPersons = $this->request->getArgument('selPersons');
    foreach($selectedPersons as $person)
    {
        if( strlen($person['__identity']) > 0 )
        {
            $project->addPerson($this->personRepository->findByIdentifier($person['__identity']));
        }
    }
    $this->projectRepository->update($project);

    //...
}

以及 Project 中的 addPerson() 函数:

public function addPerson(\DS\Datenbank\Domain\Model\Person $person) {
    if( !$this->persons->contains($person) )
      $this->persons->add($person);
  }
4

2 回答 2

0

For me this works. I assume you have the appropriate add-methods in both models. Btw: you do not need "targetEntity" in flow, it is found automagically by the @var declaration above.

Is your database up to date? Did you flush the cache?

于 2014-02-18T10:32:04.993 回答
0

我检查了“变通”替代方案并且它有效。所以总结一下我做了什么:

=> 我不是在项目端添加/删除人员,而是在人员端添加/删除项目在您在上面看到的项目中相同的旧addpersonAction()中。

但问题仍然悬而未决:它真的只能这样工作吗?为什么?

于 2014-02-18T14:32:24.337 回答