Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Laravel和Elotent更新多个记录?_Php_Laravel_Laravel 5_Eloquent_Laravel 5.7 - Fatal编程技术网

Php 如何使用Laravel和Elotent更新多个记录?

Php 如何使用Laravel和Elotent更新多个记录?,php,laravel,laravel-5,eloquent,laravel-5.7,Php,Laravel,Laravel 5,Eloquent,Laravel 5.7,我有一个在Laravel5.7上使用PHP编写的项目。我正在使用雄辩的ORM与数据库交互 我需要能够在从数据库中提取大量记录后更新它们 以下是我如何努力做到这一点 $records = Record::where('Key','Test')->get(); $values = collecT([ ['Id' => 1, 'Col' => 100], ['Id' => 2, 'Col' => 200], ['Id' => 3, 'Col' =>

我有一个在Laravel5.7上使用PHP编写的项目。我正在使用雄辩的ORM与数据库交互

我需要能够在从数据库中提取大量记录后更新它们

以下是我如何努力做到这一点

$records = Record::where('Key','Test')->get();

$values = collecT([
  ['Id' => 1, 'Col' => 100],
  ['Id' => 2, 'Col' => 200],
  ['Id' => 3, 'Col' => 500],
  ....
]);

foreach($records as $record) {
  $newValue = $values->where('Id', $record->id)->first();

  if(is_null($newValue)){
      continue;
  }

  $record->ColName = $newValue['Col'];
  $record->save();
}
上述代码不会将更新后的值写入数据库。但是,如果我执行以下操作,它会得到更新

foreach($values as $value) {
    $record = Record::where('Key','Test')->where('id', $value['Id'])->first();

    if(is_null($record)){
       continue;
    }

    $record->ColName = $value['Col'];
    $record->save();
}
尽管上面的代码有效,但我必须为
$values
数组中的每个记录执行1个select+1 update语句。如果
$values
数组的大小为1000。这将产生多达2000个查询,这是疯狂的


如何在不进行范围更新的情况下正确更新数据库中的多条记录。

如果您尝试更新的所有行都将获得相同的值,这是一个很容易的问题。问题变得有点棘手,因为所有的行都需要用不同的值更新。在github问题上,laravel有一个解决方案,它只需一个查询即可完成,在这种情况下,与逐个更新1000行相比,它的性能提高了13倍:

public static function updateValues(array $values)
{
    $table = MyModel::getModel()->getTable();

    $cases = [];
    $ids = [];
    $params = [];

    foreach ($values as $id => $value) {
        $id = (int) $id;
        $cases[] = "WHEN {$id} then ?";
        $params[] = $value;
        $ids[] = $id;
    }

    $ids = implode(',', $ids);
    $cases = implode(' ', $cases);
    $params[] = Carbon::now();

    return \DB::update("UPDATE `{$table}` SET `value` = CASE `id` {$cases} END, `updated_at` = ? WHERE `id` in ({$ids})", $params);
}
你也可以尝试做类似的事情