Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多对多关系学说_Php_Postgresql_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php 多对多关系学说

Php 多对多关系学说,php,postgresql,symfony,doctrine-orm,doctrine,Php,Postgresql,Symfony,Doctrine Orm,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{ /** *

我没有为我的问题找到合适的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;
}
问题是,考虑到我是“用户1”,我需要按照以下结构列出聊天室中的所有用户

聊天室1:

  • 用户1
  • 用户2
聊天室2:

  • 用户1
  • 用户3
聊天室3:

  • 用户1
  • 用户6
聊天室4:

  • 用户1
  • 用户2
  • 用户3
在第二个查询中,我需要列出与我的聊天室相关的、与我的用户不同的所有不同用户

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

任何人都可以帮我吗?

对于第一个视图,只需获取所有聊天室对象,然后循环这些对象及其关联用户集合之类的东西

$ChatRooms = $em->getRepository('YourBundle:ChatRoom')->findAll();
$chattrooms
传递到您的视图并循环浏览它们

{% 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

对于第一个视图,只需获取所有聊天室对象,然后在这些对象及其关联用户集合上循环

$ChatRooms = $em->getRepository('YourBundle:ChatRoom')->findAll();
$chattrooms
传递到您的视图并循环浏览它们

{% 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

以下是您要查找的内容:

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

以下是您要查找的内容:

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

你是说SQL还是DQL?这些都是非常不同的东西。可能是SQL或DQL,我没有问题!在我使用这两种方法时,问题是返回以下数据结构。您是指SQL还是DQL?这些都是非常不同的东西。可能是SQL或DQL,我没有问题!在我使用这两种方法的理论中,问题是返回后面的数据结构。在发布答案之前,我已经尝试了代码。如果您能告诉我第一个查询的问题是什么,我可以再次检查。在发布答案之前,我已经尝试了代码。如果您告诉我第一个查询有什么问题,我可以再次检查。