1

現在、Flow3 (Doctrine) で "Project" と "Person" の間の最初の多対多の関係に取り組んでおり、両方のコントローラーから要素を追加、取得、および削除したいと考えています。

プロジェクト宣言:

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」オブジェクトを使用して「Project」側で回避策を構築する必要がありますか、それとも見逃した簡単な解決策がありますか?

以下は、動作しない 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(\DS\Datenbank\Domain\Model\Person $person) {
    if( !$this->persons->contains($person) )
      $this->persons->add($person);
  }
4

2 に答える 2

0

私にとってこれはうまくいきます。両方のモデルに適切な add-methods があると思います。ところで: フローに「targetEntity」は必要ありません。上記の @var 宣言によって自動的に検出されます。

データベースは最新ですか?キャッシュをフラッシュしましたか?

于 2014-02-18T10:32:04.993 に答える
0

「回避策」の代替案を確認しましたが、機能します。だから私がしたことを要約すると:

=> Project 側で Person を追加/削除する代わりに Person 側で Project を追加/削除しますが、上記Projectの同じ古いaddpersonAction()で行います。

しかし、問題は未解決です: 本当にこの方法でしか機能しないのですか? なぜですか?

于 2014-02-18T14:32:24.337 に答える