Как заказать по счету в Доктрине 2?
Я пытаюсь сгруппировать свой объект по полю (году) и сделать его подсчет.
код:
public function countYear()
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('b.year, COUNT(b.id)')
->from('\My\Entity\Album', 'b')
->where('b.year IS NOT NULL')
->addOrderBy('sclr1', 'DESC')
->addGroupBy('b.year');
$query = $qb->getQuery();
die($query->getSQL());
$result = $query->execute();
//die(print_r($result));
return $result;
}
Я не могу сказать COUNT(b.id) AS count
, поскольку он дает ошибку, и
Я не знаю, что использовать в качестве значения addOrderby(???, 'DESC')
?
Ответы
Ответ 1
какая ошибка вы получаете при использовании COUNT(b.id) AS count
? это может быть потому, что count
является зарезервированным словом. попробуйте COUNT(b.id) AS idCount
или аналогичный.
попробуйте $qb->addOrderby('COUNT(b.id)', 'DESC');
.
Какова ваша система баз данных (mysql, postgresql,...)?
Ответ 2
Существует множество ошибок и обходных решений, необходимых для достижения порядка по выражениям по версии 2.3.0 или ниже:
-
Предложение order by не поддерживает выражения, но вы можете добавить поле с выражением в select и order by. Поэтому стоит повторить, что собственное решение Tjorriemorrie действительно работает:
$qb->select('b.year, COUNT(b.id) AS mycount')
->from('\My\Entity\Album', 'b')
->where('b.year IS NOT NULL')
->orderBy('mycount', 'DESC')
->groupBy('b.year');
-
Doctrine зажимает равенство (например, =
, LIKE
, IS NULL
) в выражении select. Для тех случаев единственным решением, которое я нашел, является использование подзапроса или самосоединения:
$qb->select('b, (SELECT count(t.id) FROM \My\Entity\Album AS t '.
'WHERE t.id=b.id AND b.title LIKE :search) AS isTitleMatch')
->from('\My\Entity\Album', 'b')
->where('b.title LIKE :search')
->andWhere('b.description LIKE :search')
->orderBy('isTitleMatch', 'DESC');
-
Чтобы подавить дополнительное поле из результата, вы можете объявить его AS HIDDEN
. Таким образом вы можете использовать его в порядке, не получив его в результате.
$qb->select('b.year, COUNT(b.id) AS HIDDEN mycount')
->from('\My\Entity\Album', 'b')
->where('b.year IS NOT NULL')
->orderBy('mycount', 'DESC')
->groupBy('b.year');
Ответ 3
Если вы хотите, чтобы метод Repository возвращал Entity, вы не можете использовать ->select()
, но вы можете использовать ->addSelect()
со скрытым выбором.
$qb = $this->createQueryBuilder('q')
->addSelect('COUNT(q.id) AS HIDDEN counter')
->orderBy('counter');
$result = $qb->getQuery()->getResult();
$result
будет объектом класса сущности.
Ответ 4
Пожалуйста, попробуйте этот код для ci 2 + doctrine 2
$where = " ";
$order_by = " ";
$row = $this->doctrine->em->createQuery("select a from company_group\models\Post a "
.$where." ".$order_by."")
->setMaxResults($data['limit'])
->setFirstResult($data['offset'])
->getResult();`