Symfony Doctrine - 查询后的 OrderBy
Symfony Doctrine - OrderBy after query
我只想订购上一个主查询的结果。
我想要查看次数最多的前 10 篇文章,然后按 "addedAt date" DESC 排序。
我知道 orderBy 甚至 addOrderBy 等函数,但这不是我需要的,或者我没有实现正确。
获得 5 篇文章前 2 名的示例:
- 姓名:一个||观看次数:100 ||添加时间:10/04/2017
- 姓名:b ||意见:10 ||添加时间:17/04/2017
- 姓名:c ||意见:50 ||添加时间:15/04/2017
- 姓名:d ||意见:25 ||添加时间:12/04/2017
- 姓名:e ||观看次数:200 ||添加时间:05/04/2017
我先摘取浏览量最多的:
- e条
- 甲条
然后按 addedAt date DESC(最近)排序:
- 甲条
- e条
我的查询:
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
也许如果您使用 'n.addedAt' 的第一个订单,然后 'n.nbViews',就像这样:
$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setMaxResults($limit);
您可以创建子查询并在主查询中使用它:
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
。
根据 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();
}
也是工作。
如果将 ->setFirstResult( '1' ) 添加到代码的 Israel Rodriguez Sanchez 作品中
$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setFirstResult( '1' )
->setMaxResults($limit);
我只想订购上一个主查询的结果。
我想要查看次数最多的前 10 篇文章,然后按 "addedAt date" DESC 排序。
我知道 orderBy 甚至 addOrderBy 等函数,但这不是我需要的,或者我没有实现正确。
获得 5 篇文章前 2 名的示例:
- 姓名:一个||观看次数:100 ||添加时间:10/04/2017
- 姓名:b ||意见:10 ||添加时间:17/04/2017
- 姓名:c ||意见:50 ||添加时间:15/04/2017
- 姓名:d ||意见:25 ||添加时间:12/04/2017
- 姓名:e ||观看次数:200 ||添加时间:05/04/2017
我先摘取浏览量最多的:
- e条
- 甲条
然后按 addedAt date DESC(最近)排序:
- 甲条
- e条
我的查询:
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
也许如果您使用 'n.addedAt' 的第一个订单,然后 'n.nbViews',就像这样:
$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setMaxResults($limit);
您可以创建子查询并在主查询中使用它:
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
。
根据 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();
}
也是工作。 如果将 ->setFirstResult( '1' ) 添加到代码的 Israel Rodriguez Sanchez 作品中
$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setFirstResult( '1' )
->setMaxResults($limit);