我想在Symfony2.1
和Doctrine.
中实现特定用户的好友列表
让我们说好友表:
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.
中实现这一点
一个选项就像分别查询两列并组合结果和排序。但这需要更多时间来执行并获得结果。我希望尽快得到快速反应。有什么方法可以查询吗?
答案 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();