0

エンティティの関係を作成する必要があるため、次のシナリオがあります。

エンティティ A - エンティティ B との
OneToMany 関係 エンティティ B - エンティティ C との OneToMany 関係

エンティティ A で「検索」を実行すると、ORM は一致するエンティティ B のすべての行を自動的に照会します。私には明確ではありませんが、ORM が一致するすべてのエンティティ C 行を自動的にクエリするかどうかです。

$em = $this->getDoctrine()->getEntityManager();
$project = $em->getRepository('MyAppMainBundle:Project')->find($id);
$client = $project->getClient();
$clientProjects = $client->getClientProjects();

このシナリオが可能である場合、それを実装するためのベスト プラクティスは何ですか?

ありがとう、

JB


アップデート

私は実際にマッピング関係でこれを行う方法を見つけました。キーは、エンティティ B がエンティティ C に適切にマッピングされるように、エンティティのマッピングを設定しています。回答を参照してください。

4

3 に答える 3

2

関係を適切にマッピングするだけで準備完了です。OneToMany/ManyToOne が必要なようです。

于 2012-06-27T23:17:46.277 に答える
1

これが私が問題を解決した方法です:

Parent Entity 'Client':

/**
 * @ORM\OneToMany(targetEntity="ClientProject", mappedBy="client")
 */
private $clientProjects;

子エンティティ 'ClientProject':

/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="ClientProject")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="id")
 */
private $client;    

その後、コントローラーは次のコードを使用できます。

$em = $this->getDoctrine()->getEntityManager();
$project = $em->getRepository('MyAppMainBundle:Project')->find($id);
$client = $project->getClient();
$clientProjects = $client->getClientProjects();

foreach ($clientProjects as $clientProject) {
    echo $clientProject->getSomeProperty();
}
于 2012-06-27T23:18:16.643 に答える
0

すべてのエンティティを 1 回のリクエストでフェッチする場合は、カスタム リポジトリ クラスを作成し、QueryBuilder を使用して、A が B と C を結合するクエリを作成することをお勧めします。それ以外の場合、結果は LAZY_FETCH オプション、AFAIR に依存します。

于 2012-06-27T19:54:37.510 に答える