$flight->fill(['name' => 'Flight 22']);
黑名单属性
$fillable 就像是可以被赋值属性的“白名单”,还可以选择使用 $guarded。$guarded 属性包含你不想被赋值的属性数组。所以不被包含在其中的属性都是可以被赋值的,因此,$guarded 功能就像“黑名单”。当然,这两个属性你只能同时使用其中一个而不能一起使用,因为它们是互斥的。下面的例子中,除了 price 之外的所有属性都是可以赋值的:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * 不能被批量赋值的属性 * * @var array */ protected $guarded = ['price']; }
如果你想要让所有属性都是可批量赋值的,可以将 $guarded 属性设置为空数组:
/** * The attributes that aren't mass assignable. * * @var array */ protected $guarded = [];
其它创建方法
firstOrCreate/firstOrNew
还有其它两种可以用来创建模型的方法:firstOrCreate 和 firstOrNew。firstOrCreate 方法先尝试通过给定列/值对在数据库中查找记录,如果没有找到的话则通过给定属性创建一个新的记录。
firstOrNew 方法和 firstOrCreate 方法一样先尝试在数据库中查找匹配的记录,如果没有找到,则返回一个新的模型实例。需要注意的是,通过 firstOrNew 方法返回的模型实例并没有持久化到数据库中,你还需要调用 save 方法手动持久化:
// 通过属性获取航班, 如果不存在则创建... $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']); // 通过name获取航班,如果不存在则通过name和delayed属性创建... $flight = App\Flight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1] ); // 通过属性获取航班, 如果不存在初始化一个新的实例... $flight = App\Flight::firstOrNew(['name' => 'Flight 10']); // 通过name获取,如果不存在则通过name和delayed属性创建新实例... $flight = App\Flight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1] );
updateOrCreate
与此类似的,你还会碰到如果模型已存在则更新,否则创建新模型的场景,Laravel 提供了一个 updateOrCreate 方法来一步完成。和 firstOrCreate 方法一样,updateOrCreate 方法会持久化模型,所以无需调用 save():
// 如果有从奥克兰到圣地亚哥的航班则将价格设置为 $99 // 如果没有匹配的模型则创建之 $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] );