这个问题在SO上有一些答案,但是它们中没有一个似乎有助于完成一项简单的任务。
我需要使用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
对象创建一个更新查询,但我只需要一个查询。 This source建议您应该依赖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()
的结果分配给变量,并在foreach循环后尝试execute()
,我会看到$ query理解并累积set()
,但它对{ {1}}条件。
有没有办法在QueryBuilder中完成这样的任务?
更新 - 类似问题:
Multiple update queries in doctrine and symfony2 - 这个不假设一个查询中的UPDATE;
Symfony - update multiple records - 这也说,qoute,'一个选择 - 一个更新';
此查询中的 Update multiple columns with Doctrine in Symfony - WHERE
条件始终相同,而不是我的情况;
Doctrine 2: Update query with query builder - 与之前相同,只有一个WHERE
条款;
http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html - 学说批量处理根本没有提到条件......
在MySQL中,我曾经使用WHERE
来做,但是Doctrine不支持。