这个问题有一些答案,但实际上,它们似乎都无法帮助完成一项简单的任务。
我需要使用 Doctrine2 QueryBuilder 根据一个查询中的条件更新多行。最明显的方法应该是错误的:
$userAgeList = [
'user_name_a' => 30,
'user_name_b' => 40,
'user_name_c' => 50,
];
//Array of found `User` objects from database
$usersList = $this->getUsersList();
foreach($usersList as $user)
{
$userName = $user->getName();
$user->setAge($userAgeList[$userName]);
$this->_manager->persist($user);
}
$this->_manager->flush();
它将为每个创建一个更新查询User
事务中的对象,但我只需要一个查询。这个来源 http://labs.octivi.com/mastering-symfony2-performance-doctrine/建议您相反应该依赖UPDATE
查询,因为在这种情况下我们只执行一个SQL UPDATE
声明,所以我做了这样的:
$userAgeList = [
'user_name_a' => 30,
'user_name_b' => 40,
'user_name_c' => 50,
];
$builder = $this->_manager->getRepository(self::REPOSITORY_USER)
->createQueryBuilder(self::REPOSITORY_USER);
foreach($userAgeList as $userName => $age)
{
$builder->update(self::REPOSITORY_USER, 'user')
->set('user.age', $builder->expr()->literal($age))
->where('user.name = :name')
->setParameter('name', $userName)
->getQuery()->execute();
}
但这也使得(显然)是一堆更新而不是一个更新。如果我分配结果getQuery()
到一个变量,并尝试execute()
在 foreach 循环之后,我看到 $query 理解并积累了set()
,但它没有做这样的事情WHERE
健康)状况。
有什么方法可以在 QueryBuilder 中完成这样的任务吗?
更新-类似问题:
学说和 symfony2 中的多个更新查询 https://stackoverflow.com/questions/10405467/multiple-update-queries-in-doctrine-and-symfony2- 这一个不假设更新one query;
Symfony - 更新多条记录 https://stackoverflow.com/questions/8764029/symfony-update-multiple-records- 这还表示,qoute,“一选一更新”;
使用 Symfony 中的 Doctrine 更新多个列 https://stackoverflow.com/questions/4803436/update-multiple-columns-with-doctrine-in-symfony - WHERE
这个查询中的条件总是相同的,不是我的情况;
原则 2:使用查询生成器更新查询 https://stackoverflow.com/questions/4337751/doctrine-2-update-query-with-query-builder- 和之前一样,只有一个WHERE
clause;
http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html- 条令批处理根本没有提到条件......
在 MySQL 中我曾经使用CASE-THEN
,但这不受 Doctrine 支持。