Laravel 5使用不同的值更新多行

时间:2016-07-14 08:59:32

标签: php mysql laravel

我一直在寻找解决方案,我希望有人已经解决了这个问题,或者有一些改进的好主意。

我正在使用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(...)同时更新多行,但是使用此方法,您只能将所有行更新为相同的值,而不是像我的例子。

提前感谢您的帮助!

3 个答案:

答案 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();