Doctrine Query Builder を使用するなど、追加の作業は必要ありません!
User との多対多の自己参照を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 エンティティを取得し、すべての友達を取得できます。
$user = $this->getDoctrine()
->getRepository('AcmeUserBundle:User')
->findOneById($anUserId);
$friends = $user->getMyFriends();
$names = array();
foreach($friends as $friend) $names[] = $friend->getName();