我只想订购上一个主要查询的结果。
我希望前10个观看次数最多的文章然后通过"添加日期" DESC。
我知道 orderBy 甚至 addOrderBy 等功能,但这不是我在这里所需要的,或者我没有实现它正确。
获得5篇文章的前2名的例子:
我首先提取最多的观点:
然后命令它添加日期DESC(最新):
我的查询:
public function findMostViewed($limit=10, $asArray=false)
{
$qb = $this->createQueryBuilder('n')
->orderBy('n.nbViews', 'DESC')
//->addOrderBy('n.addedAt', 'DESC')
->getQuery()
->setMaxResults($limit);
return ($asArray) ? $qb->getResult(Query::HYDRATE_ARRAY) : $qb->getResult();
}
如果我知道如何进行preSelectQuery,它可能会解决问题......
我想到了一个SQL查询:
SELECT ...
FROM ...
WHERE id IN(SELECT id FROM News ORDER BY nbViews DESC LIMIT 10)
ORDER BY addedAt DESC
答案 0 :(得分:1)
您可以创建子查询并在主查询中使用它:
public function findMostViewed($limit=10, $asArray=false)
{
$subqb = $this->createQueryBuilder('nn')
->orderBy('nn.nbViews', 'DESC')
->getQuery()
->setMaxResults($limit);
$qb = $this->createQueryBuilder('n')
->where($qb->expr()->in('n.id', $subqb->getDQL())
->orderBy('n.addedAt', 'DESC')
->getQuery();
return ($asArray) ? $qb->getResult(Query::HYDRATE_ARRAY) : $qb->getResult();
}
请注意在子查询中使用nn
而不是n
。
答案 1 :(得分:0)
也许如果你使用'n.addedAt'的第一个订单,然后是'n.nbViews',就像这样:
$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setMaxResults($limit);
答案 2 :(得分:0)
基于 Veve 的回答,我更改了WHERE IN条件并设法使其正常工作。
public function findMostViewed($limit=10, $asArray=false)
{
$subqb = $this->createQueryBuilder('nn')
->orderBy('nn.nbViews', 'DESC')
->getQuery()
->setMaxResults($limit);
$qb = $this->createQueryBuilder('n')
->where('n.id IN (:ids)')
->setParameter('ids', array_values($subqb->getResult()))
->orderBy('n.addedAt', 'DESC')
->getQuery();
return ($asArray) ? $qb->getResult(Query::HYDRATE_ARRAY) : $qb->getResult();
}
答案 3 :(得分:0)
这也是工作。 如果将-> setFirstResult('1')添加到代码的以色列罗德里格斯·桑切斯的工作
$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setFirstResult( '1' )
->setMaxResults($limit);