我在将以下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)
答案 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();