【问题标题】:Flow3 - How to create a simple-to-use many-to-many relation?Flow3 - 如何创建简单易用的多对多关系?
【发布时间】:2014-03-17 20:37:27
【问题描述】:

我目前正在处理 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;

 // ...
}

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

这里是projectController的sn-p代码,不起作用:

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);
  }

【问题讨论】:

  • 此操作是由 GET 请求还是由 POST 请求调用的?数据只会在 POST/SAVE/DELETE 请求中自动保存,而不会在 GET 请求中保存。您必须在 GET 请求调用的操作中手动保存数据。
  • 整个代码有点笨拙,并且包含许多不必要的东西,这使得它更加复杂;但是,您的问题还存在吗?

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


【解决方案1】:

对我来说这是可行的。我假设您在两个模型中都有适当的添加方法。顺便说一句:流程中不需要“targetEntity”,它是由上面的@var 声明自动找到的。

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

【讨论】:

  • 感谢 targetEntity 信息,但它仍然无法与 mappedBy 对象上的添加/删除功能一起使用。 (例如“项目”)
  • 你能从任一方获取相关对象吗?奥德这也不行吗?
  • 是的,get 函数有效。顺便说一句,添加/删除功能不会提供错误消息,但它们不会对数据库执行任何操作。我添加了我的 projectController 的代码 sn-p,但它不起作用
【解决方案2】:

我检查了“变通”替代方案,它可以工作。 所以总结一下我做了什么:

=> 我不是在 Project 端添加/删除 Person,而是在 PersonProject /strong> 侧,但在您在上面看到的 Project 中的旧 addpersonAction() 中。

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

【讨论】:

  • 请看我在你的问题下的评论。您使用哪种请求类型?
  • 是的,add 函数来自 GET 调用。
  • 存储库不会自动保存在 GET 调用中。您需要手动持久化它们。
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多