欢迎访问宙启技术站
智能推送

laravel的fill方法怎么用

发布时间:2023-05-17 14:35:21

Laravel的fill方法是用于设置模型的属性值的快捷方式。它允许我们在一行代码中为模型的多个属性分配值。这里是一些有关Laravel的fill方法的详细解释:

## 基本语法

在使用其它快捷方法之前,让我们首先来看看fill方法的基本语法。在一个模型中,我们可以调用fill方法并将一个数组作为参数传入。数组的键是属性名称,而值则是要设置的属性值。下面是使用fill方法的基本语法:

$model->fill([
    'attribute1' => 'value1',
    'attribute2' => 'value2'
]);

在这个例子中,我们将属性attribute1attribute2分别设置为value1value2

## 保护属性

有时候我们可能会需要保护某些属性。这些属性通常是我们不希望用户直接设置的属性,例如数据库中的主键或者其它被保护的数据库字段。如果我们尝试使用fill方法设置保护属性的值,我们会抛出MassAssignmentException异常。

为了规避这个问题,我们可以在模型中定义一个$guarded属性。这个属性定义了那些属性是被保护的,不允许使用fill方法进行赋值。例如:

class MyModel extends Model
{
    protected $guarded = ['id'];
}

在这个例子中,我们保护了模型的id属性,不允许在调用fill方法时进行设置。

## 可填充属性

与保护属性相对的是$fillable属性。这个属性列出了我们允许使用fill方法进行赋值的属性。如果尝试通过fill方法设置$fillable属性以外的其它属性,也会抛出MassAssignmentException异常。

class MyModel extends Model
{
    protected $fillable = ['name', 'email'];
}

在这个例子中,只有nameemail属性可以使用fill方法进行赋值。

## 关联模型

在填充属性时,我们也可以使用关联模型。如果我们想要为一个具有关联模型的属性进行设置,我们可以在fill数组的值中传入另一个数组,这个数组则表示关联模型。例如:

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

class Role extends Model
{
    //
}

$user->fill([
    'name' => 'John',
    'email' => 'john@example.com',
    'roles' => [
        [
            'name' => 'admin',
            'description' => 'admin role'
        ],
        [
            'name' => 'moderator',
            'description' => 'moderator role'
        ]
    ]
]);

在这个例子中,我们为user设置了一个nameemail属性,并设置了一个关联到roles表的roles属性。每个roles属性都是一个关联模型,包含了namedescription属性。

## 使用firstOrNew和firstOrCreate

除了使用fill方法以外,我们也可以在使用firstOrNewfirstOrCreate方法时直接传入一个关联数组。这个方法会根据传入的数组,创建一个新的模型实例或者查找一个与之匹配的模型。

// 根据email是否相等查找或新建一个User模型实例
$user = User::firstOrNew(['email' => 'john@example.com']);

// 根据email是否相等查找或新建一个User,并设置name属性为John
$user = User::firstOrNew(['email' => 'john@example.com'], ['name' => 'John']);

// 根据email是否相等查找或新建一个User,并将其存入数据库
$user = User::firstOrCreate(['email' => 'john@example.com'], ['name' => 'John']);

## 结论

fill方法是一个非常方便快捷的方法,可以在一行代码中为模型的多个属性分配值。但是,使用前请注意必须保证fillable和guarded属性的设置正确,否则可能引起MassAssignmentException异常。另外,在使用关联模型时,将关联模型的属性定义为fillable或guarded属性中的一部分也是必要的。