使用QueryBuilder进行Doctrine 2条件多行更新

时间:2014-12-27 12:00:25

标签: php symfony doctrine-orm

这个问题在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不支持。

0 个答案:

没有答案