Laravel5.7 Eloquent ORM快速入门详解(4)

在这个例子中,我们只是简单分配 HTTP 请求中的 name 参数值给 App\Flight 模型实例的 name 属性,当我们调用 save 方法时,一条记录将会被插入数据库。created_at 和 updated_at 时间戳在 save 方法被调用时会自动被设置,所以没必要手动设置它们。

更新

save 方法还可以用于更新数据库中已存在的模型。要更新一个模型,应该先获取它,设置你想要更新的属性,然后调用 save 方法。同样,updated_at 时间戳会被自动更新,所以没必要手动设置其值:

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();

批量更新

更新操作还可以同时修改给定查询提供的多个模型实例,在本例中,所有有效且 destination=San Diego 的航班都被标记为延迟:

App\Flight::where('active', 1)
  ->where('destination', 'San Diego')
  ->update(['delayed' => 1]);

update 方法要求以数组形式传递键值对参数,代表着数据表中应该被更新的列。

注:通过 Eloquent 进行批量更新时,saved 和 updated 模型事件将不会在更新模型时触发。这是因为在进行批量更新时并没有从数据库获取模型。

批量赋值

还可以使用 create 方法保存一个新的模型。该方法返回被插入的模型实例。但是,在此之前,你需要指定模型的 fillable 或 guarded 属性,因为所有 Eloquent 模型都通过批量赋值(Mass Assignment)进行保护,这两个属性分别用于定义哪些模型字段允许批量赋值以及哪些模型字段是受保护的,不能显式进行批量赋值。

当用户通过 HTTP 请求传递一个不被期望的参数值时就会出现安全隐患,然后该参数以不被期望的方式修改数据库中的字段值。例如,恶意用户通过 HTTP 请求发送一个 is_admin 参数,然后该参数映射到模型的 create 方法,从而允许用户将自己变成管理员。

所以,你应该在模型中定义哪些属性是可以进行赋值的,使用模型上的 $fillable 属性即可实现。例如,我们设置 Flight 模型上的 name 属性可以被赋值:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * 可以被批量赋值的属性.
  *
  * @var array
  */
 protected $fillable = ['name'];
}

设置完可以被赋值的属性之后,我们就可以使用 create 方法在数据库中插入一条新的记录。create 方法返回保存后的模型实例:

$flight = App\Flight::create(['name' => 'Flight 10']);

如果你已经有了一个模型实例,可以使用 fill 方法通过数组属性来填充: