2017-12-18 22 views
0

SymfonyプロジェクトでDoctrineを使用すると私が混乱します。単一のエンティティからすべての行を要求するとき、同じテーブルを別のテーブルに結合するときに得られるよりも多くの行が得られます。これより左結合のクエリが少ない行を返します

$query = $this->getEntityManager()->createQueryBuilder(); 
$query->select('obj') 
    ->from('AppBundle:Data', 'obj'); 

$query = $this->getEntityManager()->createQueryBuilder(); 
$query->select('obj') 
    ->from('AppBundle:Data', 'obj') 
    ->leftJoin('obj.subDatas', 'sd') 
    ->leftJoin('sd.subSubDatas', 'ssd'); 

はどのようにそれはそうかもしれない

この

は、より多くの行を返すのですか?私はこれがinnerJoinの場合に当てはまると思いますが、結果は少なくともleftJoinを使用するときには多かれ少なかれ行になると考えました。

これは予想されますか?

UPDATE

だから私はこの混乱の実際の原因は、上記のクエリの後に改ページを追加しているように見えることを考え出し:

$query 
    ->setMaxResults(20) 
    ->setFirstResult(0); 

これは(上記の使用leftJoinとうまく機能していないようですこれは最初の例では結果の数が正しい理由です)。 leftJoinsを使用するときに、正しい行数を返すようにするにはどうすればよいですか?

+2

repoメソッドの最後に 'return $ query-> getResult() - > getSQL()'を使用して、実際のsqlコードがどのように生成されているかを確認できます。デバッグの目的で使用します。 –

+0

はい、左結合では、同じ条件の内部結合と同じ行数と、少なくとも左テーブルと同じ数の行を返す必要があります。しかし、[mcve]がなければ、私たちは入力と出力が何であるか本当に分かりません。 – philipxy

+0

上記の私の質問では、bd参照を修正し、問題と思われるページネーションに関する質問を追加しました。 – theva

答えて

1

左結合がtoMany関係の場合、それはSQLの一般的なデカルト積です。 objからの行は、可能な値のすべてがsdssdで展開されます。

DQLでtoMany関係を使用してクエリにページを設定する場合は、教義の水分を処理する適切なページ設定が必要です。

+0

私はDoctrine Paginator http://www.doctrine-project.org/api/orm/2.5/class-Doctrine.ORM.Tools.Pagination.Paginator.htmlについて知りましたが、私のクエリでも動作するようにはできませんでしたが、それはちょうど空の結果を返しました...それはここで役に立つはずですか? – theva

+1

あなたの質問全体を表示すると、助けを得るのがはるかに簡単になります:) – Erwan

関連する問題