doctrine2多次自我引用中间细节

时间:2011-11-09 15:11:33

标签: php orm doctrine-orm

我想创建一个自引用实体,但有关于该关系的描述(以及可能的其他信息)。一个例子是社交网络应用程序中的朋友 - 人A(实体)可以与人B(实体)链接,但他们的关系可以被描述为“朋友”,“兄弟”,“叔叔”等。

从Doctrine文档中,类可以使用以下链接表自引用:

<?php
/** @Entity */
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="User", mappedBy="myFriends")
     */
    private $friendsWithMe;

    /**
     * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
     * @JoinTable(name="friends",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")}
     *      )
     */
    private $myFriends;

    public function __construct() {
        $this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
        $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

但是,您似乎无法使用此方法添加属性。

问题是,有没有办法在单个类中处理这个问题(即User.php) - 或者实际上是否需要创建一个“链接”类 - 比如UserLink.php?当我开始关系时,我有点陷入制作链接类:

class UserLink
{
    // ...

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $relationship; // being brother, uncle etc

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="links")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * @var type
     */
    private $user;
}

但我不确定接下来会发生什么......?

研究stackoverflow我发现了类似的问题,但更多关于直接链接。

Doctrine2: Best way to handle many-to-many with extra columns in reference table

Need help understanding Doctrine many to many self referencing code

1 个答案:

答案 0 :(得分:3)

解决这个问题:

user.php的

/**
 * @ORM\OneToMany(targetEntity="UserLink", mappedBy="user")
 */
private $relations;    

UserLink.php

/**
 * @ORM\Column(type="text", nullable=true)
 */
protected $relationship;

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="relations")
 * @ORM\JoinColumn(name="user_ud", referencedColumnName="id")
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="related_user_id", referencedColumnName="id")
 */
protected $relateduser;

它需要在控制器和模型中添加更多代码,但效果很好。它使用户能够调用getRelations:

{% for link in user.relations %}
    {{ link.relateduser.name }} ({{ link.relationship }})
{% endfor %}