5

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"返されるようにするために使用できますかproductgroups

2-そうでない場合、fetch="EAGER"パフォーマンスを損なうことなく多対多のエンティティで使用するケースはありますか

3- findBy をオーバーライドするのは良い方法ですか? 欠点はありますか?

ありがとう、

4

1 に答える 1

1

FETCH_EAGER モードには問題があります。実際、この問題を解決するためのオープン リクエストがここにありますが、まだクローズされていません。

カスタム リポジトリを使用して、必要な方法でデータを取得することをお勧めします。

于 2013-10-22T06:00:48.877 に答える