我目前正在研究 Flow3(学说)中"项目"和"人"之间的第一个多对多关系,并希望从两个控制器中添加、获取和删除元素。
项目申报:
class Project {
// ...
/**
* @var DoctrineCommonCollectionsCollection</*...*/Person>
* @ORMManyToMany(targetEntity="/*...*/Person", mappedBy="projects")
*/
protected $persons;
// ...
}
人员声明:
class Person {
// ...
/**
* @var DoctrineCommonCollectionsCollection</*...*/Project>
* @ORMManyToMany(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);
//...
}
以及项目中的 addPerson() 函数:
public function addPerson(DSDatenbankDomainModelPerson $person) {
if( !$this->persons->contains($person) )
$this->persons->add($person);
}
对我来说,这有效。我假设您在两种模型中都有适当的添加方法。顺便说一句:你不需要 "targetEntity" 在 flow 中,它是由上面的 @var 声明自动找到的。
您的数据库是最新的吗?是否刷新了缓存?
我检查了"变通方法"替代方案,它可以工作。所以总结一下我所做的:
=> 不是在项目端添加/删除人员,而是在人员方面添加/删除项目,但在您上面看到的项目中的旧 addpersonAction() 中。
但问题仍然悬而未决:它真的只有这样工作吗,为什么?