【问题标题】:Symfony/DQL - Find a row with 2 users in a many-to-manySymfony/DQL - 在多对多中查找有 2 个用户的行
【发布时间】:2015-10-16 10:43:41
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过使用joins?你能告诉我们你到目前为止尝试了什么吗?
  • 其实我什么都没做,我正在考虑。我最好的主意是使用 Exist 关键字。我读过你可以使用 EXIST 来使用多个 WHERE。但我在教义中使用它失败了。
  • 我终于想出了如何使用 SQL 来解决这个问题。现在,我必须使用 DQL 让它工作。 SELECT * FROM conversation WHERE EXISTS( SELECT * FROM participant WHERE participant.user_id = 3 ) AND EXISTS( SELECT * FROM participant WHERE participant.user_id = 4 )

标签: php database symfony dql query-builder


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多