学说 - 左边加入LIMIT

时间:2017-08-23 13:04:28

标签: symfony doctrine-orm greatest-n-per-group dql

我有两张桌子:多对一关系中的帖子和评论。

table post                        table comment
p_id | name   | u_id              c_id | p_id | comment        | date
1    | post 1 | 1                 1    | 1    | blah blah blah | 2017-01-01
2    | post 2 | 2                 2    | 1    | blah blah blah | 2017-01-04
3    | post 3 | 1                 3    | 2    | blah blah blah | 2017-01-07
...                               ...

我想通过u_id检索所有帖子,其中3个按日期排序的最后评论。

我愿意:

SELECT p, c 
FROM p
LEFT JOIN p.comments c WITH c.date IN (SELECT c2.date) FROM App\Bundle\Entity\Comment as c2 WHERE c2.post = p.p_id ORDER BY date ASC LIMIT 3)
WHERE p.user = 1

但是,学说不允许LIMIT,我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

在我看来,最简单的方法是使用函数

setMaxResults($limit);

我举个例子:

$qb = $this->createQueryBuilder('a');

$qb
  ->innerJoin('a.advert', 'adv')
  ->addSelect('adv')
;

$qb->setMaxResults($limit);

return $qb
  ->getQuery()
  ->getResult()

我希望它能帮到你

答案 1 :(得分:0)

正如我所知QueryBuilder::setMaxResult()仅适用于主表而非子查询。

恕我直言,最好用经典的SQL编写它,你可以更好地控制子查询和加入什么。在这种情况下,您将获得普通数组而不是具有关系的对象数组。但是,当您只需要显示帖子列表而不与单个实体交互时,这会更好。在这种情况下,从DQL中逐个填充整个对象,比使用SQL中的普通数组慢得多。

你可以这样做:

$conn = $this->getEntityManager()->getConnection();
$stmt = $conn->prepare('SELECT ...');
$stmt->execute($parameters);
$results = $stmt->fetchAll(\PDO::FETCH_ASSOC);