私はしばらくこの問題に苦しんでおり、すべての関連トピックは私の特定のニーズに合っていません。私は、幅広いエンティティについてシステム監視を提供する「ダッシュボード」を構築しています。明らかな理由から、できるだけ効率的にクエリを保存したいと考えています。そのため、すべての関連情報を取得するエンティティごとにクエリを1つに制限しようとしています。Doctrine QueryBuilder> ManyToMany関係の操作
私の問題は、ManyToMany(またはOneToMany)関係エンティティから特定のデータを抽出する必要があるときに発生します。
たとえば、次のような場合、私はリンクされている請求書がない勘定科目の額を探しています。
$qb = $this->getDoctrine()->getManager()->createQueryBuilder();
$qb->select(array(
'COUNT(account) as totalAccounts',
'SUM(account.active) as activeAccounts',
'SUM(account.approved) as approvedAccounts',
'SUM(account.reverted) as revertedAccounts',
'SUM(account.approvalRequested) as pendingApprovalAccounts',
"SUM(CASE WHEN COUNT(account.invoices) = 0 THEN 1 ELSE 0 END) as testAccounts"
))
->from('AppBundle:Account', 'account');
は、私は、次のエラーが表示さ: QueryException:意味論的エラー】ライン0、COL 252近く '請求書)= 0':エラー:無効PathExpression。 StateFieldPathExpressionまたはSingleValuedAssociationFieldが必要です。
次の例では、未払いの請求書が添付されているユーザーの数を検索しようとしています。私はuser.invoicesに参加して別のアプローチを試みました。この場合
$qb = $this->getDoctrine()->getManager()->createQueryBuilder();
$qb->select(array(
'COUNT(user) as totalUsers',
'SUM(user.active) as activeUsers',
"SUM(CASE WHEN user.userType = 'MONTHLY' AND user.active = true THEN 1 ELSE 0 END) as monthlyUsers",
"SUM(CASE WHEN user.userType = 'PAYG' AND user.active = true THEN 1 ELSE 0 END) as paygUsers",
"SUM(CASE WHEN user.noticeType = 'SWITCH' AND user.active = true THEN 1 ELSE 0 END) as noticeUsersPayg",
"SUM(CASE WHEN user.noticeType = 'DISABLE' AND user.active = true THEN 1 ELSE 0 END) as noticeUsersDisable",
"SUM(CASE WHEN SUM(CASE WHEN invoices.datePaid is null THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END) as suspendedUsers",
))
->from('AppBundle:User', 'user')
->leftJoin('user.invoices', 'invoices');
私はエラーを取得する: SQLSTATE [HY000]:一般的なエラー:グループ関数の1111不正使用
私は簡単で、必要なすべてのSELECTサブクエリと右のクエリを構築することができますSQLを使用していますが、QueryBuilderを使用してこれを正しい方法で実行しようとしています。 QueryBuilderはまた、SELECTサブクエリを受け入れない、または許可していないようです。私はおそらくいくつか(または多くの)間違ったことをしていることを知っています。それがこの質問を投稿している理由です。リレーショナルエンティティが返されたデータに影響を与えるクエリは、私たちが遭遇した問題であり、この問題に対処する適切なコンテンツを見つけることができなかったので、
グループ化する列を指定する場所が表示されません。 –
@SloanThrasher私はグループ化する列を指定しません。私が間違っていない限り、それは必要ではありません。 (2番目の例では)通常のSQLでは 'SELECT ....、SUM(SELECT COUNT(id)FROM invoices where datePaidがヌルで、idがin(invoice_users iuからのSELECT invoice_id) iu.user_id = user.id))> 0 THEN 1 ELSE 0 END)suspendUser from users user' グループは必要ありません。 – Magnanimity
エラーメッセージが表示されます。あなたはグループ関数を使用しているので、集計、集計などのためにデータをグループ化する必要があるカラムを教えてください。 –