我有以下代码,它生成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次迭代后执行查询,我将逃避输入等...首先我希望我的查询工作)
答案 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)
后重新开始构建查询