Symfony2:fetch =“EAGER”创建连接吗?

时间:2013-10-17 08:37:51

标签: php mysql sql symfony doctrine-orm

我在product实体中有这个映射属性:

/**
 * @ORM\ManyToMany(targetEntity="Group", mappedBy="products", indexBy="id", fetch="EAGER")
 *
 */
protected $groups;

我想知道,我对fetch="EAGER"的理解是,一旦选择了产品,它应该会获得组,这就是发生的事情,但每当我执行类似findBy()的查询时,它会使用2个查询product和另一个获得groups

有没有让findBy()或其他帮助方法在一个查询中获取product及其groups,或者唯一的方法是编写自定义存储库函数并执行{ {1}}我自己?

更新

我尝试了多种解决方案并最终覆盖LEFT-JOIN函数,例如:

findBy()

问题

1-我可以使用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; } } 使findBy在一个查询中返回fetch="EAGER"及其product

2-如果没有那么是否有任何情况我使用groups多对多实体而不会影响性能

3-覆盖findBy是一个好方法吗?任何缺点?

谢谢,

1 个答案:

答案 0 :(得分:1)

FETCH_EAGER模式存在问题。事实上,有一个开放请求here来解决此问题但尚未关闭。

我建议使用自定义存储库以您希望的方式获取数据。