Доктрина N + 1 проблема с вложенными отношениями «один-к-одному»Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Доктрина N + 1 проблема с вложенными отношениями «один-к-одному»

Сообщение Anonymous »

Я столкнулся с ужасной проблемой N+1 при использовании Doctrine, особенно при получении таблиц с двунаправленными отношениями «один к одному». Теперь я понимаю, что в Doctrine следует избегать двунаправленных отношений «один-к-одному», но я работаю над старой кодовой базой и хочу изменить как можно меньше, поскольку не знаю, могут ли быть побочные эффекты.
Контекст
У меня есть таблица 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»