product
エンティティ内にこのマップされたプロパティがあります:
/**
* @ORM\ManyToMany(targetEntity="Group", mappedBy="products", indexBy="id", fetch="EAGER")
*
*/
protected $groups;
私の理解でfetch="EAGER"
は、製品が選択されたらグループを取得する必要があるということですが、これは何が起こるかですが、findBy()
1つのクエリを取得して を取得するためproduct
に別のクエリを実行するたびに、2つのクエリを使用しますgroups
。
とにかく作るfindBy()
か、他のヘルパーメソッドが1つのクエリでproduct
うまくいくか、それともgroups
カスタムリポジトリ関数を書いてLEFT-JOIN
自分でやるしかない唯一の方法はありますか?
アップデート
私は複数の解決策を試しましたが、次のfindBy()
ような関数を上書きしてしまいました:
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
$q = $this
->createQueryBuilder('u')
->select('u, g')
->leftJoin('u.groups', 'g')
->setFirstResult( $offset )
->setMaxResults( $limit );
foreach ($criteria as $field => $value)
{
$q
->andWhere(sprintf('u.%s = :%s', $field, $field))
->setParameter($field, $value)
;
}
foreach ($orderBy as $field => $value)
{
$q->addOrderBy(sprintf('u.%s',$field),$value);
}
try
{
$q = $q->getQuery();
$users = $q->getResult();
return $users;
}
catch(ORMException $e)
{
return null;
}
}
質問
1- findByが 1 つのクエリで一緒にfetch="EAGER"
返されるようにするために使用できますかproduct
groups
2-そうでない場合、fetch="EAGER"
パフォーマンスを損なうことなく多対多のエンティティで使用するケースはありますか
3- findBy をオーバーライドするのは良い方法ですか? 欠点はありますか?
ありがとう、