Symfony2 / Doctrine 循环查询
Symfony2 / Doctrine queries in loops
我正在清理其他人编写的一些旧代码,因为我们遇到了超时问题,尤其是对于挑战我们系统极限的客户。
我知道这是一个反模式,代码中充满了这种变化:
$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
语句的查询构建器,绑定到用户 ID 数组和带有公司 ID 的 andWhere
如果目标是执行 DELETE,并且之后您不对该实体进行任何其他使用,则可以使用精心设计的 DQL 请求。
如果需要,我可以编辑并放置更多助手。
我正在清理其他人编写的一些旧代码,因为我们遇到了超时问题,尤其是对于挑战我们系统极限的客户。
我知道这是一个反模式,代码中充满了这种变化:
$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
语句的查询构建器,绑定到用户 ID 数组和带有公司 ID 的andWhere
如果目标是执行 DELETE,并且之后您不对该实体进行任何其他使用,则可以使用精心设计的 DQL 请求。
如果需要,我可以编辑并放置更多助手。