Flow3 - 如何创建一个简单易用的多对多关系?

时间:2014-02-18 08:22:25

标签: doctrine-orm doctrine typo3 entity-relationship typo3-flow

我目前正在研究“Project”和“Person”之间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;

 // ...
}

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

以下是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);
  }

2 个答案:

答案 0 :(得分:0)

对我而言,这是有效的。我假设你在两个模型中都有适当的添加方法。顺便说一下:你在流程中不需要“targetEntity”,它可以通过上面的@var声明自动找到。

您的数据库是最新的吗?你有没有刷新缓存?

答案 1 :(得分:0)

我检查了“解决方法”替代方案并且它有效。 总结一下我的所作所为:

=&GT;我没有在项目一侧添加/删除人员,而是在人员一侧添加/删除项目,您在上面看到的项目中的旧 addpersonAction()

但问题仍然是开放的:它真的只是这样工作吗?为什么?