2017-06-12 18 views
2

私はちょうど本当に迷惑なことに出くわしました。私はqueryBuilderを持っています:Doctrineクエリービルダーが間違った結果

$queryBuilder 
    ->select('a') 
    ->addSelect('am') 
    ->addSelect('m') 
    ->addSelect('c') 
    ->addSelect('t') 
    ->leftJoin('a.articleMedias', 'am') 
    ->leftJoin('am.media', 'm') 
    ->leftJoin('a.categories', 'c') 
    ->leftJoin('a.translations', 't') 
    ->add('where', $queryBuilder->expr()->in('a.site', $ids)) 
; 

私は192のオブジェクトを取得します。 問題は、SQLをダンプしてdbに直接実行すると、529個のオブジェクトが取得されることです。しかし、それは同じクエリです!

誰かが2つの結果の間にこのギャップの原因を知っていますか?

EDIT:何かを見つけました。私はカウントのクエリを行うとき、私は203の結果を得るが、私は正常なものを行い、結果をカウントすると、私は192の結果を得る。それは教義が最大のヴァルスか何かを持っているということですか?

EDIT 2:私のアプリケーション固有の継承問題のようです。私を助けてくれてありがとう。

+0

は? –

+1

それが原因leftJoinsのです。あなたは、DBのクエリをよく見ると結果には、結合された内容が異なる間に 'a'を含む行が複数回存在することがわかります。ネイティブSQLクエリに' GROUP BY a.id'を追加してみてください(これは多くのデータを排除しますが、aからの各エントリは1回だけ表示されるため、結果は192になります)。 – Joe

+0

お返事ありがとうございます。私は何かにつながるかもしれない何かを見つけました。私はSQLのcount()クエリを行うとき、私は203の結果を取得します。しかし、私はgetResult()とphp count()を実行すると、私は192を取得します。それは本当に奇妙で、私は実際に失われています。 –

答えて

2

これに対する最も可能性の高い答えは(左が加入のために)あなたは529個のオブジェクトが、192個のオブジェクトが構築されるの529行を取得していないこと、です。

クエリをデータベースに直接配置する場合は、ユニークな数(またはオブジェクトのSQL:DISTINCT行)をカウントする必要があります。ID列に応じて、ダンプするクエリをSELECT DISTINCT <you_primary_key_column>, <rest of your query>に変更します。あなたが行っているSQLクエリは何あなたの192個のオブジェクトに一致した行。

ない場合、あなたはあなたの結果のクエリを投稿してくださいだろうか?

+0

ご返信ありがとうございます。私は別のクエリを追加すると、私は同じ結果を得る。しかし、私はselectとaddを自分のquerybuilderに入れておくか、a.idでグループ化するともっと近い結果が得られます。未加工のクエリは、203の結果を返します。また、クエリビルダは192に固執します。元のクエリは次のとおりです。https://gist.github.com/TristanPerchec/4cf6e70787bd6a7017d301a3e3ce830b –