1

エンティティ「asset」は「logEntries」に関連付けられています。アセットごとに 0..N 個のログ エントリが存在する可能性があります。

各ログ エントリの一部は、フィールド (またはプロパティ) の「ステータス」です。各アセットの現在のステータスは、最新のログ エントリで定義されます。アセットに関連付けられたログ エントリがない場合、そのステータスは不明です。

現在、各ステータスの資産を数えています。ステータスの例は「利用可能」です。

問題はそれです:

  • 過去にステータスの値が交互に変化した場合、いずれかのアセットが複数回カウントされます (ほぼすべてのアセットがそうです)。
  • または、各アセットの最新のログ エントリを検索しているが、一部のアセットにはログ エントリがなく、DQL の集計関数が失敗するため、エラーが発生します。

私は次のコードを試しています:

 $qb = $this->_em->createQueryBuilder();
 $qb->select('COUNT(a)')
  ->from('AppAssetBundle:Asset', 'a')
  ->leftJoin('a.logEntries', 'l')
  ->where('l.status = '.$status_id)
  ->andWhere('l.id = MAX(l.id)')
 ;
 return $qb->getQuery()->getSingleScalarResult();

エラーは次のとおりです。

SQLSTATE[HY000]: 一般エラー: 1111 グループ関数の無効な使用

で置き換え->andWhere()->having()もうまくいきませんでした。

もしあれば、アソシエーションの最新のエンティティを取得する方法を知っている人はいますか?

関連するフィールドがない場合、クエリ全体でエラーではなく 0 を返すようにしたいと思います :)

4

1 に答える 1