我一直在寻找解决方案,我希望有人已经解决了这个问题,或者有一些改进的好主意。
我正在使用Laravel 5,我遇到了需要使用新值更新许多行的情况。现在我正在为所有这些行做一个for循环来更新它们,我想优化它,这样我就不会运行很多sql查询。这是一个示例代码:
<?php
//Well, the original code looks better than this, but the concept is the same
$myrows = [0,1,2,3,4,5,6,7,8,9];
$myvalues = [45,543,657,574,234,26457,2462,897,234,89032];
for($i=0;$i<count($myrows);$i++) {
MyClass::where('id', $myrows[$i])->update(['myColumn' => $myvalues[$i]]);
}
?>
显然这将执行10个查询(与我想要更新的行数量相同),但出于优化目的,我只想用一个查询执行此操作。我知道能够使用whereIn(...) - &gt; update(...)同时更新多行,但是使用此方法,您只能将所有行更新为相同的值,而不是像我的例子。
提前感谢您的帮助!
答案 0 :(得分:0)
这不是Laravel QueryBuilder的问题。如果你只能在一个SQL查询中做你的东西,你几乎可以用Laravel来做。
答案 1 :(得分:0)
$myRows = [0,1,2,3,4,5,6,7,8,9];
$myValues = [45,543,657,574,234,26457,2462,897,234,89032];
if (empty($myRows)) {
// return or throw exception
return;
}
if (count($myRows) != count($myValues) {
// in case of dynamic values for $myRows/$myValues
return;
}
$cases = [];
$cases[] = "CASE id";
for ($myRows as $row) {
$cases[] = "WHEN {$row} THEN ?";
}
$cases = implode(" ", $cases);
$ids = implode(",", $myRows);
DB::update("UPDATE `my_table` SET `my_column` = {$cases} END WHERE `id` in ({$ids})", $myValues);
答案 2 :(得分:0)
在 SQL 中,每个查询都按顺序执行。
foreach ( array_combine($myrows,$myvalues) a $id => $val){
MyClass::find($val)->update(['myColumn' => $val]);
}
你唯一能做的就是追加查询,然后发送一次, 像这样:
$builder = DB::table((new MyClass)->getTable());
$sql='';
foreach ( array_combine($myrows,$myvalues) a $id => $val){
$sql .= $builder->getGrammar()->insert($builder->where('id', $id),['myColumn' => $val]);
}
DB::connection()->getPdo()->prepare($sql)->execute();