比方说,我想在Doctrine中实现以下实体:
Thing
表示可以对另一个Thing
执行操作的任何内容。 Relation
可以包含两个实体和一个动作描述,其元组是唯一的。
以下是我要实现的目标的一些示例:
如您所见,订购很重要(“鲍勃喜欢苹果”和“鲍勃喜欢苹果”并不相同。)
尽管我尽了最大的努力,但我找不到任何合适的方法来实现这一目标。
我尝试在$relations
中创建一个标记为“一对多”的名为Thing
的字段,然后在{{1}中标记$left
和$right
}为“多对一”。问题是,同一拥有侧(至少是AFAIK)不能有两个反向侧。
当前的实现方式不允许在Relation
字段中获取特定Thing
的所有关系,因为我只能指定一个反面。
这是到目前为止我要提出的:
$relations
答案 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;
}