使用Doctrine在Symfony2.1中实现好友列表

时间:2013-02-07 14:15:54

标签: symfony doctrine-orm symfony-2.1

我想在Symfony2.1Doctrine.中实现特定用户的好友列表 让我们说好友表:

User1 User2 Status     //0-pending request,1-accepted
A     B      0
A     C      1
D     A      1
E     A      1

现在我想在列表中获取A的朋友姓名。对于此SQL查询,可以使用UNION实现,如许多其他答案中所述。但我想在doctrine query builder.中实现这一点 一个选项就像分别查询两列并组合结果和排序。但这需要更多时间来执行并获得结果。我希望尽快得到快速反应。有什么方法可以查询吗?

1 个答案:

答案 0 :(得分:3)

您无需任何额外工作,例如使用Doctrine Query Builder!

只需将实体类User设计为many-to-many self-reference with User,例如:

 * @ORM\Table()
 * @ORM\Entity()
 */
class User
{
....

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", unique=true, length=255)
     * 
     */
    private $name;

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

    /**
     * @ORM\ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
     * @ORM\JoinTable(name="friends",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\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 = $this->getDoctrine()
                ->getRepository('AcmeUserBundle:User')
                ->findOneById($anUserId);
$friends = $user->getMyFriends();
$names = array();
foreach($friends as $friend) $names[] = $friend->getName();