原则中的自定义多对多关系

时间:2019-03-28 21:00:40

标签: php doctrine-orm doctrine

比方说,我想在Doctrine中实现以下实体:

Thing表示可以对另一个Thing执行操作的任何内容。 Relation可以包含两个实体和一个动作描述,其元组是唯一的。

以下是我要实现的目标的一些示例:

  • 母鸡(东西)产卵(动作)蛋(东西)
  • 水(东西)扑灭(动作)火(东西)
  • 鲍勃(事物)喜欢(动作)苹果(事物)
  • 鲍勃(东西)喝(动作)水(东西)

如您所见,订购很重要(“鲍勃喜欢苹果”和“鲍勃喜欢苹果”并不相同。)


尽管我尽了最大的努力,但我找不到任何合适的方法来实现这一目标。

我尝试在$relations中创建一个标记为“一对多”的名为Thing的字段,然后在{{1}中标记$left$right }为“多对一”。问题是,同一拥有侧(至少是AFAIK)不能有两个反向侧。

当前的实现方式不允许在Relation字段中获取特定Thing的所有关系,因为我只能指定一个反面。

这是到目前为止我要提出的:

$relations

1 个答案:

答案 0 :(得分:0)

结果证明教义并不直接允许这种关系。

我能想到的最好的解决方案是在Thing中为关系创建两个集合,而不是一个,然后定义一个输出两者的方法:

/** @ORM\Entity */
class Thing {
  // [...]

  /** @ORM\OneToMany(targetEntity="Relation", mappedBy="left") */
  protected $relationsLeft;

  /** @ORM\OneToMany(targetEntity="Relation", mappedBy="right") */
  protected $relationsRight;

  public function getRelations() {
    return new ArrayCollection(array_merge(
      $this->relationsLeft->toArray(),
      $this->relationsRight->toArray()
    ));
  }
}


/** @ORM\Entity */
class Relation {
  // [...]

  /** @ORM\Id @ORM\ManyToOne(targetEntity="Thing", inversedBy="relationsLeft") */
  private $left;

  /** @ORM\Id @ORM\ManyToOne(targetEntity="Thing", inversedBy="relationsRight") */
  private $right;
}