Как сделать заказ по количеству в Учении 2? - PullRequest
14 голосов
/ 14 мая 2011

Я пытаюсь сгруппировать свою сущность по полю (году) и подсчитать его.

Код:

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')?

Ответы [ 4 ]

44 голосов
/ 01 декабря 2012

Существует множество ошибок и обходных путей, необходимых для достижения порядка по выражениям начиная с v2.3.0 или ниже:

  1. Предложение 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');
    
  2. Doctrine подавляет равенство (например, =, LIKE, IS NULL) в выражении выбораВ этих случаях единственное решение, которое я нашел, - это использовать подвыбор или самосоединение:

    $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');
    
  3. Чтобы исключить дополнительное поле из результата, вы можете объявить его 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');
    
8 голосов
/ 14 мая 2011

какую ошибку вы получаете при использовании COUNT(b.id) AS count?это может быть потому, что count является зарезервированным словом.попробуйте COUNT(b.id) AS idCount или аналогичный.

или попробуйте $qb->addOrderby('COUNT(b.id)', 'DESC');.

какова ваша система баз данных (mysql, postgresql, ...)?

2 голосов
/ 26 апреля 2017

Если вы хотите, чтобы ваш метод репозитория возвращал сущность, которую вы не можете использовать ->select(), но вы можете использовать ->addSelect() со скрытым выбором.

$qb = $this->createQueryBuilder('q') ->addSelect('COUNT(q.id) AS HIDDEN counter') ->orderBy('counter'); $result = $qb->getQuery()->getResult();

$resultбудет объектом класса сущности.

0 голосов
/ 15 марта 2012

Пожалуйста, попробуйте этот код для ci 2 + доктрина 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();`
...