2017-10-30 8 views
0

私の問題のために適切なDoctrine SQL/DQLを見つけられません。Doctrine Many To Many Relation

class User{ 
    /** 
    * Many Users have Many Groups. 
    * @ORM\ManyToMany(targetEntity="ChatRoom", inversedBy="users") 
    * @ORM\JoinTable(name="users_chats") 
    */ 
    private $chats; 
} 

class ChatRoom{ 
    /** 
    * Many Groups have Many Users. 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="chats") 
    */ 
    private $users; 
} 

問題は、私が「ユーザー1」であると考えて、チャットルーム内のすべてのユーザーを以下の構造でリストする必要があることです。

チャットルーム1:

  • ユーザ1人の
  • ユーザ2

チャットルーム2:

  • ユーザ1
  • ユーザ3

チャットルーム3:

  • ユーザ1
  • ユーザ6

チャットルーム4:

  • ユーザ1
  • ユーザ2
  • ユーザ3

2番目のクエリでは、自分のユーザーと異なるChatRoomに関連するすべての異なるユーザーをリストする必要があります。

  • ユーザー2
  • ユーザー3
  • ユーザー6

誰もが私を助けることができますか?

+0

あなたは、SQLまたはDQLを意味しましたか?これらは非常に異なるものです。 – svgrafov

+0

SQLまたはDQLでもかまいませんが、問題はありません! Doctrineでは両方を使用しますが、問題はそれに続くデータ構造を返すことです。 – fabionvs

答えて

3

を含めたくないユーザーIDになりますあなたが探しているものです:

$qb = $entityManager->createQueryBuilder(); 
$results1 = $qb->select('c, u') 
    ->from('ChatRoom', 'c') 
    ->join('c.users', 'u') 
    ->join('c.users', 'u0', 'WITH', 'u0.id = :yourUserId') 
    ->setParameter('yourUserId', $yourUserId) 
    ->getQuery()->getArrayResult(); 
var_dump($results1); 

$qb = $entityManager->createQueryBuilder(); 
$results2 = $qb->select('DISTINCT(u)') 
    ->from('User', 'u') 
    ->where('u.id != :yourUserId') 
    ->join('u.chats', 'c') 
    ->join('c.users', 'u1', 'WITH', 'u1.id = :yourUserId') 
    ->setParameter('yourUserId', $yourUserId) 
    ->getQuery()->getResult(); 
var_dump($results2); 
+0

第2のものは素晴らしいですが、最初のものはまだ勉強中です... – fabionvs

+0

私は答えを投稿する前にコードを試しました。最初のクエリで何が問題なのかを再度確認することができます。 –

0
最初のビューのために

ちょうどそれらを通して、あなたのビューとループにすべてのチャットルームのオブジェクトを取得し、その後、これらのオブジェクトをループし、

$ChatRooms = $em->getRepository('YourBundle:ChatRoom')->findAll(); 

ような彼らのasociatedユーザーコレクションの気にいらパス$ChatRooms

{% for ChatRoom in ChatRooms %} 
    {{ ChatRoom.getName() }} /* display chat room name */ 
    {% for user in ChatRoom.getUsers() %} 
     {{ user.getName() }} /* display user name */ 
    {% endfor%} 
{% endfor%} 

これらのチャットルームの別個のユーザーを取得するための2番目のクエリDQL

SELECT DISTINCT u 
FROM YourBundle:User u 
JOIN u.chats 
WHERE u.id != :userid 

:useridこれはあなたがここで返された結果に