我没有为我的问题找出正确的原则SQL/DQL。
class User{
/**
* Many Users have Many Groups.
* @ORMManyToMany(targetEntity="ChatRoom", inversedBy="users")
* @ORMJoinTable(name="users_chats")
*/
private $chats;
}
class ChatRoom{
/**
* Many Groups have Many Users.
* @ORMManyToMany(targetEntity="User", mappedBy="chats")
*/
private $users;
}
问题是我需要在以下结构中列出聊天室中的所有用户,考虑到我是"用户 1"。
聊天室 1:
- 用户 1
- 用户 2
聊天室2:
- 用户 1
- 用户 3
聊天室3:
- 用户 1
- 用户 6
聊天室 4:
- 用户 1
- 用户 2
- 用户 3
在第二个查询中,我需要列出与我的聊天室相关的与我的用户不同的所有不同用户。
- 用户 2
- 用户 3
- 用户 6
有人可以帮助我吗?
以下是您要查找的内容:
$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);
对于第一个视图,只需获取所有 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