我有两张桌子:多对一关系中的帖子和评论。
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,我怎么能这样做?
答案 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);