У меня есть это сопоставленное свойство внутри моего объекта product
:
/** * @ORM\ManyToMany(targetEntity="Group", mappedBy="products", indexBy="id", fetch="EAGER") * */ protected $groups;
Интересно, мое понимание для fetch="EAGER"
заключается в том, что он должен получать группы после выбора продукта, это то, что происходит, но он использует 2 запроса, когда я делаю что-то вроде findBy()
один запрос, чтобы получить product
а другой чтобы получить groups
.
Есть ли findBy()
заставить findBy()
или другие вспомогательные методы получить product
вместе с его groups
в одном запросе или единственный способ написать пользовательскую функцию репозитория и сделать сам LEFT-JOIN
?
ОБНОВИТЬ
Я попробовал несколько решений и endup, переписывая 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- Могу ли я использовать fetch="EAGER"
чтобы findBy возвращал product
вместе с его groups
в один запрос
2- Если нет, то есть ли случай, когда я использую fetch="EAGER"
со многими-ко-многим объектами без fetch="EAGER"
производительности
3- Переопределение findBy – хороший подход? любые недостатки?
Благодаря,
У режима FETCH_EAGER есть проблемы. На самом деле для решения этой проблемы существует открытый запрос, но он еще не закрыт.
Я рекомендую использовать специальный репозиторий для извлечения данных так, как вы хотите.