如何使用SET CASE更新多行,然后使用Doctrine查询

时间:2017-11-08 16:05:14

标签: mysql doctrine-orm

我有以下代码,它生成DQL查询。 当我回复我的$ dql并将其复制粘贴到phpmyadmin并执行它时,它完美地运行,但是当尝试使用Doctrine执行它时,我一直遇到“ '[语法错误]第0行,col 6981:错误:意外的'WHERE' “错误。我做错了什么?

$dqlStaticPartial = $dql = "UPDATE \VendorName\MyBundle\Entity\Product cp SET cp.guide_number = CASE ";
$uniqueIds = [];
$i = 0;

foreach($result as $row){
    $guideNumber = $this->generateGuideNumber($param1, $param2);
    $dql .= "WHEN cp.uniqid = '".$row['uniqid']."' THEN '$guideNumber' ";
    $uniqueIds[] = "'".$row['uniqid']."'";
    $i++;

    if($i % 100 === 0){
        $dql .= " END WHERE uniqid IN (".implode(',', $uniqueIds).")";
        $this->entityManager->createQuery($dql)->execute();
        $dql = $dqlStaticPartial;
    }
}

(我知道,这不行,我将把它放在一个事务中,我将在每100次迭代后执行查询,我将逃避输入等...首先我希望我的查询工作)

1 个答案:

答案 0 :(得分:1)

我的猜测是你有超过100条记录,如果是这种情况,那么你要创建的问题之一是你的查询最终会像这样:

UPDATE cp SET cp.guide_number = CASE 
    WHEN cp.uniqid = '1' THEN '1234'
    -- more rows ...
    WHEN cp.uniqid = '99' THEN '4563'
    END
WHERE uniqid IN (1,...,99)
    WHEN cp.uniqid = '100' THEN '1234'
    -- more rows ...
    WHEN cp.uniqid = '199' THEN '4563'
    END
WHERE uniqid IN (100,...,199)

等。等

您应该清除查询中已执行的部分,然后在到达($i % 100 === 0)后重新开始构建查询