我正在开发一个分为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();