2017-08-16 12 views
1

私は2つのエンティティ、国と地方を持っている、と私は省エンティティにおける多対一の関係に設定している:教義とManyToOneエンティティ

エンティティ/省ここ

/** 
* @var \AppBundle\Entity\Country 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country") 
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id") 
* 
*/ 
private $ubicacionpaisid; 

私が手をすべての結果省のエンティティを使用して:

$cb = $this->getDoctrine() 
     ->getEntityManager() 
     ->getRepository(Province::class) 
     ->createQueryBuilder('a'); 

をしかし、私は実行する場合:

var_dump($cb->getQuery()->getDQL()); 

それが返されます。

string(41) "SELECT a FROM AppBundle\Entity\Province a" 

私が見ることが予想どのSQLにおける省エンティティに、国の実体を結合するクエリました。

私には何が欠けていますか?

+1

代わりのvar_dumpを使用しての、ちょうどダンプを使用しています。出力がどのようにクリーンであるかに驚く。 https://symfony.com/doc/current/components/var_dumper.html – Cerad

答えて

1

私は2人だけで協会のEAGERロードを使用すると言う答えを与えた実現。しかし、私はそれをお勧めできません。これはあなたのプロジェクトについての多くの仮定をもたらし、どのような場合でもいつもその協会に参加したいと思っていて、フォームでcause issuesを実行して予期せぬ動作を引き起こすことさえあります。

また、ユーザーはカスタムのQueryBuilder呼び出しを使用してデータを取得していることを示しているので、明示的に結合を使用しないのはなぜですか?例えば

:まだ

$cb = $this->getDoctrine()->getEntityManager()->getRepository(Province::class) 
    ->createQueryBuilder('p') 
    ->select('p, c') 
    ->join('p.ubicacionpaisid', 'c') 
    ->getQuery() 
    ->getResult() 
; 

以上、ProvinceRepositoryとから:オフトピック

return $this->createQueryBuilder('p') 
    ->select('p, c') 
    ->join('p.ubicacionpaisid', 'c') 
    ->getQuery() 
    ->getResult() 
; 
+1

これは動作しますが、私は "WITH"と "a.ubicacionpaisid = p.id"を使用しなければなりません。間違いなく、教義は主体間の関係を認識していない。しかし、スキーマの更新後、PHPのmyadminで外部キーが表示されます...フェッチEAGERは私のために働いていません。 – user1185430

+0

外字キーが出現するようになったので、それが 'WITH'なしであるのだろうかと思います。うーん。いずれにしてもうまくいきました。 –

+0

私は彼が実際に彼のクエリを構築する最良の方法を求めていたなら、これがより良い答えであることに同意します。しかし、質問はSQLがなぜ参加していないのかということでしたので、あなたの答えは間違っています。 – DarkMukke

2

これは、Doctrineに2種類の結合があるためです。 通常のジョインとフェッチ・ジョイン。フェッチ結合では、Doctrineは2つの異なるクエリを実行し、次に2番目の結果を1番目の結果/データに含めるだけです。

これは、遅延結合とも呼ばれます。レイジー結合がデフォルトの動作です。
DarkMukkeが言ったように...

は、あなたがデータをフェッチしようとしましたあなたはfetch="EAGER"

/** 
* @var \AppBundle\Entity\Country 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER") 
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id") 
* 
*/ 
0

とあなたの関係を変化させることによって、この動作を変更できますか?

あなたの関係で追加する=「EAGER」フェッチ

/** 
* @var \AppBundle\Entity\Country 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER") 
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id") 
* 
*/ 
private $ubicacionpaisid; 

これはフェッチし、同様に関連するエンティティをロードする必要があります。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#manytoone

+0

GJはあなたが文字通り私が言ったことを言った – DarkMukke

+1

真実、それは私がそれを書くのを始めたときそこになかった。私はあなたに信用を与える;) – Enumus

関連する問題