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方法是什么?

两种可能性:

  1. 使用带有 whereIn 语句的查询生成器,绑定到用户 ID 数组和具有公司 ID 的andWhere

  2. 如果目标是执行 DELETE,并且之后未对实体进行任何其他使用,则可以使用构建的 DQL 请求。

如果需要,我可以编辑并放置更多助手。

最新更新