Контекст
У меня есть таблица Intervention с отношением «многие к одному» с таблицей User. Таблица User имеет отношение «один к одному» с таблицей UserIdentity. Отношения отображаются с помощью User и инвертируются UserIdentity
Проблема
Я столкнулся с проблемой N+1 при попытке запросить таблицу Intervention и присоединиться к отношению User. Для каждого уникального пользователя выполняется запрос на получение соответствующего UserIdentity. Это приводит к примерно 1 тысяче уникальных запросов.
Я уже сталкивался с подобной проблемой раньше и решил ее, добавив обратную сторону отношения «один-к-одному» к моему вызову SELECT и LEFT JOIN. Однако в данном случае это, похоже, не работает.
Я подозреваю, что это связано с тем, что UserIdentity не является прямой ассоциацией с Intervention, а с User.
Что я пробовал
Вот как мой код выглядит на данный момент. Я удалил все, что не имеет отношения к проблеме.
Код: Выделить всё
$alias = "intervention";
$qb = $this->manager
->createQueryBuilder()
->select("partial $alias .{id, uuid, purpose, type, creation, detectorUuid}, intervention_user, trackdechetsIdentity, fibsd")
->from(Intervention::class, $alias)
;
$qb = $qb
->leftJoin("$alias.user", 'intervention_user')
->leftJoin("intervention_user.trackdechetsIdentity", "trackdechetsIdentity") // This is the UserIdentity entity
->leftJoin("$alias.fibsd", "fibsd") // Solving another N+1 problem, this time it's a direct one-to-one relation
->orderBy("$alias.id", 'DESC')
;
return $qb->getQuery()->getResult();
Кто-нибудь знает, как это решить?
Подробнее здесь: https://stackoverflow.com/questions/765 ... ationships
Мобильная версия