繁体   English   中英

Laravel 5 用不同的值更新多行

[英]Laravel 5 update multiple rows with different values

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

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

在此先感谢您的帮助!

$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);

在 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();

这不是 Laravel QueryBuilder 的问题。 如果你只能在一个 SQL 查询中完成你的工作,你几乎可以用 Laravel 来完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM