教义多对多关系

时间:2017-10-30 22:32:39

标签: php postgresql symfony doctrine-orm doctrine

我没有找到适合我的问题的正确的Doctrine SQL / DQL。

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;
}

问题是我需要在以下结构中列出我的ChatRooms内的所有用户,因为我是“用户1”。

ChatRoom 1:

  • 用户1
  • 用户2

ChatRoom 2:

  • 用户1
  • 用户3

ChatRoom 3:

  • 用户1
  • 用户6

ChatRoom 4:

  • 用户1
  • 用户2
  • 用户3

在第二个查询中,我需要列出与我的ChatRooms相关的所有与我的用户不同的不同用户。

  • 用户2
  • 用户3
  • 用户6

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

以下是您正在寻找的内容:

$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);

答案 1 :(得分:0)

对于第一个视图,只需获取所有ChatRooms对象,然后循环遍历这些对象及其相关的用户集合,如

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

$ChatRooms传递给您的观看并循环播放

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

对于为这些聊天室获取不同用户的第二个查询,您可以编写类似的DQL

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

:userid这将是您不希望包含在返回结果中的用户ID