web-dev-qa-db-ja.com

Doctrine 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')値として何を使用すればよいかわかりませんか?

16
Tjorriemorrie

COUNT(b.id) AS countを使用するとどのようなエラーが発生しますか? countが予約語であることが原因である可能性があります。 COUNT(b.id) AS idCountなどを試してください。

または、$qb->addOrderby('COUNT(b.id)', 'DESC');を試してください。

あなたのデータベースシステムは何ですか(mysql、postgresql、...)?

9
ax.

V2.3.0以下では、式による順序付けを実現するために必要な多くのバグと回避策があります。

  1. 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');
    
  2. 教義は平等を窒息させる(例:=LIKEIS 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');
    
  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');
    
45
b7kich

リポジトリメソッドでエンティティを返す場合は、->select()を使用できませんが、非表示の選択で->addSelect()を使用できます。

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

$resultはエンティティクラスオブジェクトになります。

3
mFlorin