Оптимизируйте DQL с помощью двойного соединения

У меня такая структура: один профиль может участвовать в нескольких исследованиях, и для каждого исследования есть поле statute, которое является внешним ключом к study_statute. В HTML в каждой строке мне нужно показать информацию для профиля: profile.name, profile.study.field, profile.study.statute. Я сделал это, используя

$profileRepository->findAll()

но он генерирует много запросов, и я хочу оптимизировать. На данный момент есть профили выборки запросов, для каждого профиля запрашиваются исследования, а для каждого исследования запрашивается название устава. Итак, если есть 2 профиля, и каждый профиль посещает 2 исследования, у меня есть

1 (список) +1 (список исследований для профиля №1) +2 (названия исследований для каждого из вышеуказанных исследований) +1 (список исследований для профиля №2) +2 (названия исследований для каждого из вышеуказанных исследований) запросов.

Как это оптимизировать?

На простом PHP я бы сделал: извлек большую таблицу для всех профилей, объединенных исследованиями и именами исследований, и разобрал ее на многомерные массивы, например. $profile[1]['studies'][1]['name'].


person koral    schedule 23.05.2012    source источник


Ответы (1)


Вы можете использовать dql присоединиться:

$profiles = $em->createQuery('select p, stu, sta from YourBundleName:Profile p join p.studies stu join stu.statute sta')
    ->getResult();

Результат будет таким же, как если бы вы использовали findAll, за исключением одного. Все связанные объекты будут извлечены. Если вы обращаетесь к «исследованию» или «уставу», Doctrine не нужно lazy load связывать с другим запросом.

person Molecular Man    schedule 23.05.2012