Symfony2 / Doctrine在循环中查询

时间:2015-04-11 13:59:42

标签: php mysql symfony doctrine-orm anti-patterns

我正在清理其他人编写的旧代码,因为我们遇到超时问题,尤其是那些正在推动我们系统极限的客户。

我知道这是一种反模式,代码中充满了各种变体:

$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();
}

它只会导致每个用户的查询,这会使服务器超时(探查器显示数百个查询)。增加超时确实有效,但是这种解决方案不能很好地扩展...并且导致我比健康更多地喝咖啡休息时间。

将此内容重写为单个更新查询的正确,有效,符号方式是什么?

1 个答案:

答案 0 :(得分:1)

两种可能性:

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

  2. 如果目标是执行DELETE,并且在此之后您不再使用该实体,则可以使用精心设计的DQL请求。

  3. 如果需要,我可以编辑并添加更多帮助。