Symfony/DQL -在多对多中查找包含2个用户的行


Symfony/DQL - Find a row with 2 users in a many-to-many

我正在开发一个分为3个实体的信使系统

  • 会话,带有会话名称
  • 参与者,会话和用户之间的多对多关系,参与者可以是所有者、主持人或简单用户
  • 对话中参与者发送的消息

并且我希望找到与用户a和B的对话,其中他们都是对话的参与者。知道怎么做吗?感谢阅读

我花了一些时间思考,花了一个小时才找到解决方案。这也将用于查找两个用户的共同朋友。

    $firstParticipant = $this->_em->createQueryBuilder();
    $firstParticipant
            ->select('pfirst')
            ->from('EvoMessengerBundle:Participant', 'pfirst')
            ->where('pfirst.user = :pfirstuser')    
            ->andWhere('pfirst.conversation = c')
    ;
    $secondParticipant = $this->_em->createQueryBuilder();
    $secondParticipant
            ->select('psecond')
            ->from('EvoMessengerBundle:Participant', 'psecond')
            ->where('psecond.user = :pseconduser')
            ->andWhere('psecond.conversation = c')
    ;
    $q =    $this->_em->createQueryBuilder();
    $q
            ->select('c')
            ->from('EvoMessengerBundle:Conversation', 'c')
            ->where($q->expr()->exists($firstParticipant->getDql()))
            ->setParameter(':pfirstuser', $first)
            ->andWhere($q->expr()->exists($secondParticipant->getDql()))
            ->setParameter(':pseconduser', $second)
            ->setMaxResults(1)
        ;
    return $q->getQuery()->getResult();