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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5967.html