Я очищаю старый код, написанный кем-то другим, потому что у нас проблемы с тайм-аутами, особенно с клиентами, которые раздвигают границы нашей системы.
Я знаю, что это анти-шаблон, и код полон вариантов этого:
$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 способ переписать это в один запрос на обновление?
Две возможности:
используя построитель запросов с whereIn
оператор, связанный с массивом идентификаторов пользователей и andWhere
с идентификатором компании
если цель состоит в том, чтобы выполнить DELETE, и после этого вы больше не используете объект, вы можете использовать специально созданный DQL-запрос.
при необходимости я могу отредактировать и поставить еще несколько помощников.
Других решений пока нет …