将带有INNER JOIN的SQL查询转换为Doctrine查询构建器

时间:2015-11-27 01:30:36

标签: mysql sql symfony doctrine-orm

我在将以下SQL查询转换为doctrine queryBuilder语法时遇到问题。我选择了查询构建器,因为我读到内部连接不可能与DQL(我很容易相处)。在经过大量搜索之后,我真的有了头脑,你会得到你平常的帮助:

SELECT m.* 
FROM  `message` AS m
INNER JOIN (SELECT sender_id, MAX(message_date) as md
                FROM message WHERE  `receiver_id` =1 GROUP BY sender_id) AS t
ON m.id=t.md and m.sender_id=t.sender_id
WHERE  `receiver_id` =1

简而言之,我的最终目标是从表中选择receiver_id收到的所有最新消息,如下所示:

  

消息(id,sender_id,receiver_id,message_date)

1 个答案:

答案 0 :(得分:0)

我认为你应该能够管理文档。
但是这是为了让你顺利前行:

Message存储库中:

$queryBuilder = $this->createQueryBuilder('m');
$queryBuilder->addSelect('s')
    ->innerJoin('m.sender', 's')
    ->where('m.receiver = :receiver_id')
    ->andWhere($queryBuilder->expr()->max('m.date'))
    ->setParameters(
        array(
            'receiver_id' => $receiver_id,
        )
    );

$query = $queryBuilder->getQuery();
return $query->getSingleResult();

我希望我能正确理解你的SQL。 没有实体定义,这就像我说的那样多。否则你应该把它们添加到你的问题......

更新

看到您的最终查询后的最后一次更新。您可以使用子查询构建器执行IN 在您的MembersManagementBundle:Message存储库中:

$qb  = $this->_em->createQueryBuilder();
$sub = $qb;

$sub->select('t')
    ->where('m.id = t.id')
    ->andWhere($qb->expr()->max('t.date'))
    ->getQuery();

$qb = $qb->select('m')
         ->where($qb->expr()->in('m', $sub->getDQL()))
         ->andWhere('m.receiver = :receiver_id');

$query = $qb->getQuery();
return $query->getResult();