0

特定のユーザーの友達リストを実装したいのですが、 友達テーブルとしましょう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しかし、これを1つのオプションで実装したいdoctrine query builder. のは、2つの列を個別にクエリし、結果を組み合わせて並べ替えるようなものです。ただし、これを実行して結果を得るには、さらに時間がかかります。できるだけ早く対応したいです。クエリする方法はありますか?

4

1 に答える 1

4

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();
于 2013-02-07T15:06:45.850 に答える