Doctrine和Symfony 2关于ManyToMany的关系

时间:2013-06-03 11:22:29

标签: symfony doctrine-orm

如果有可能通过学说制造某些东西,我就会徘徊...... 我会试着解释一下: 你有像人类一样的对象。他/她有身高,体重等属性。 现在我们有2个表“人类”和“human_attributes”。对于多对多关系,我们必须创建第三个表“human2human_attributes”,该表自己生成,其中包含列出的表中的id-s。我想要的是在两个id字段旁边放一个值字段,比如

id_human  id_human_attribute value
   2              12          180cm
转换为人类id-2的

具有值为180cm的属性id-12(高度)。

是否有可能在学说中做这样的事情,如果有人知道如何在Symfony2中实现它?

感谢。

1 个答案:

答案 0 :(得分:1)

如果要添加第三个字段,不能使用ManyToMany关系而是使用中间实体,则没有doctrine2的选择:

/**
 * @ORM\Entity()
 * @ORM\Table(name="human_has_attribute",
 *     uniqueConstraints = {
 *         @ORM\UniqueConstraint(name="unique_human_human_attribute", columns={"human_id", "human_attribute_id"})
 *     }
 * )
 */
class HumanHasAttritube
{
    // ...

    /**
     * @var Human
     * 
     * @ORM\ManyToOne(targetEntity="Human", inversedBy="humanHasAttributes")
     * @ORM\JoinColumn(name="human_id", referencedColumnName="id")
     */
    protected $human;

    /**
     * @var HumanAttribute
     * 
     * @ORM\ManyToOne(targetEntity="HumanAttribute", inversedBy="humanHasAttributes")
     * @ORM\JoinColumn(name="human_attribute_id", referencedColumnName="id")
     */
    protected $humanAttribute;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255)
     */
    protected $value;
}

请注意,由于@ORM \ Table的uniqueConstraints参数,我添加了一个唯一的SQL约束,即人类和人类属性都是唯一的(如果它尊重系统的逻辑,否则删除有关唯一性的行,或者还添加值领域,或者你想要什么^^)!

在验证添加唯一验证器时也不要忘记(如果它是唯一的):

 * @UniqueEntity(
 *      fields={"human", "humanAttribute"},
 *      message="A human can't have the same attribute 2 times."
 * )
class HumanHasAttribute