5

私は Doctrine2 (最新バージョン) で Symfony2 を使用しており、この関係を定義しています:

/**
 * @ORM\OneToMany(targetEntity="Field", mappedBy="event", fetch="EAGER")
 * @ORM\OrderBy({"name" = "ASC"})
 */
protected $fields;

関係の反対側は次のように定義されます。

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="fields", fetch="EAGER")
 * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
 */
protected $event;

「fetchOnyById」を実行すると、Doctrine は 2 つのクエリを実行します。オブジェクト自体を取得する場合は 1、関連するフィールドを取得する場合は 1 です。これが結合であることを期待しますが、そうではありません。

コントローラーで完了したら、オブジェクトを twig に渡します。そこで、オブジェクトのプロパティとしてフィールドを再度取得します。これにより、フィールドを再度取得するために別のクエリが実行されます。

1 つのクエリのみが実行され、実際には 3 つのクエリが実行されると予想されるため、明らかに私は何か間違ったことをしています。

4

1 に答える 1

3

これが発生する理由は、特定のクエリではなく、エンティティをフェッチしているためだと思います。Doctrine の考え方は、オブジェクトを取得し、データベースと対話するのではなく、格納されたエンティティのようにすべて関連付け/参照されているかのようにオブジェクト リソースを取得することです。説明しているようなクエリが必要な場合は、DQL を使用したほうがよいでしょうが、その時点では、作成されたエンティティをフェッチしていないため、カスタム結果が得られます。

これが理にかなっていることを願っています。

基本的に、使用しているデフォルトの関連付けは、結合されたクエリではなく、関連付けられたオブジェクトをフェッチすることです。

于 2013-08-10T07:04:27.400 に答える