如何使用Eloquent Laravel更新集合

16 laravel laravel-4

DeviceCommand模型之间有一对多的关系(每个Device都有很多commands).现在我想使用save()方法更新命令集合.所以,我使用了以下代码:

$device = Device::find(1);
$commands = $device->commands()->whereStatus("pending")->get();

$commands->status = "sent";
$commands->save();
Run Code Online (Sandbox Code Playgroud)

但我得到一个FatalErrorException异常,错误信息是Call to undefined method Illuminate\Database\Eloquent\Collection::save().

换句话说,我正在寻找以下的等效MySQL查询Eloquent:

UPDATE commands SET status = 'sent' WHERE status = 'pending';
Run Code Online (Sandbox Code Playgroud)

使用Laravel 4.2

Ben*_*nRH 22

你可以试试这个update方法:

$collection = $device->commands()->whereStatus("pending");
$collection->update(array("status" => "sent"));
Run Code Online (Sandbox Code Playgroud)

  • 我只是对此发表评论:变量`$ collection`实际上不是集合,是查询构建器类的实例,update()方法不属于Collection类. (8认同)
  • 这实际上不是一个可以接受的答案-上面的注释,由于“ $ collection”是QueryBuilder的实例,因此“可行” (2认同)

Geo*_*ins 7

由于$commands是一个集合,更改值$commands->status不会产生您想要的效果(status为集合中的每个项目设置"发送" 的值).

相反,独立地对集合中的每个项目执行操作:

foreach ($commands as $command)
{
    $command->status = 'sent';
    $command->save();
}
Run Code Online (Sandbox Code Playgroud)

您还可以通过查询生成器更新数据库中的项目:

DB::table('your_table')->where('status', 'pending')->update(array('status' => 'pending'));
Run Code Online (Sandbox Code Playgroud)


小智 6

Laravel 7+新功能更新:

  $device = Device::find(1);
  $commands = $device->commands()->whereStatus("pending")->get();
  $commands->toQuery()->update(array("status" => "sent"));

  // you can reload fresh data
  $commands->fresh();
Run Code Online (Sandbox Code Playgroud)