エンティティをフィールド(年)ごとにグループ化して、カウントしようとしています。
コード:
_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')
値として何を使用すればよいかわかりませんか?
COUNT(b.id) AS count
を使用するとどのようなエラーが発生しますか? count
が予約語であることが原因である可能性があります。 COUNT(b.id) AS idCount
などを試してください。
または、$qb->addOrderby('COUNT(b.id)', 'DESC');
を試してください。
あなたのデータベースシステムは何ですか(mysql、postgresql、...)?
V2.3.0以下では、式による順序付けを実現するために必要な多くのバグと回避策があります。
Order by句は式をサポートしていませんが、式を含むフィールドをselectに追加してorderbyすることができます。したがって、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');
教義は平等を窒息させる(例:=
、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');
リポジトリメソッドでエンティティを返す場合は、->select()
を使用できませんが、非表示の選択で->addSelect()
を使用できます。
$qb = $this->createQueryBuilder('q') ->addSelect('COUNT(q.id) AS HIDDEN counter') ->orderBy('counter'); $result = $qb->getQuery()->getResult();
$result
はエンティティクラスオブジェクトになります。