Symfony2 / Doctrine запросы в циклах

Я очищаю старый код, написанный кем-то другим, потому что у нас проблемы с тайм-аутами, особенно с клиентами, которые раздвигают границы нашей системы.

Я знаю, что это анти-шаблон, и код полон вариантов этого:

$userIDs = [100,101,107,208, ...]; // tons of users, but not all users in a company.
$companyID = 4356;

foreach ($userIDs as $id) {
$user = $em->getRepository('AdminBundle:Users')
->getUser($id, $companyId);
$user->removeGroup($group);
$em->persist($user);
$em->flush();
}

Это просто вызывает запрос для каждого пользователя, что приводит к превышению времени ожидания сервера (профилировщик показывает сотни запросов). Увеличение тайм-аутов работает, но это решение плохо масштабируется … и заставляет меня делать больше перерывов на кофе, чем полезно.

Каков был бы правильный, эффективный, symfony-ey способ переписать это в один запрос на обновление?

0

Решение

Две возможности:

  1. используя построитель запросов с whereIn оператор, связанный с массивом идентификаторов пользователей и andWhere с идентификатором компании

  2. если цель состоит в том, чтобы выполнить DELETE, и после этого вы больше не используете объект, вы можете использовать специально созданный DQL-запрос.

при необходимости я могу отредактировать и поставить еще несколько помощников.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector