Symfony / DQL - 在多对多

时间:2015-10-16 10:43:42

标签: php database symfony dql query-builder

我正在以3个实体分隔的Messenger系统工作

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

我希望找到与用户A和B的对话,其中两个人都是对话的参与者。知道怎么样? 感谢您阅读:)

1 个答案:

答案 0 :(得分:0)

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

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