如何在Laravel模型上设置属性的默认值

8 浏览
0 Comments

如何在Laravel模型上设置属性的默认值

如何在Laravel模型上设置属性的默认值?

我应该在创建迁移时设置默认值,还是应该在模型类中设置它?

0
0 Comments

在Laravel模型上设置属性的默认值的原因是,在使用模型进行表单验证时,希望在将其保存到数据库之前具有默认值。但是,在使用给定的示例时,需要先将记录添加到数据库中,然后才能检索默认值,这很麻烦。此外,某些列类型(如text)不允许设置默认值。

问题是如何在模型上设置默认值,而不是如何在数据库中设置默认值。这两者是不同的,有时您可能希望在不引用数据库的情况下创建一个新的模型实例。

虽然这可能是关系型数据库管理系统(RDBMS)的最佳实践,但OP没有指定他使用的是哪个数据库。在无模式设置中,这种方法不适用。

某些RDBMS(如MySQL < 8.0)仅支持常量作为字段的默认值,不支持表达式。假设您有一个年份字段,并且希望默认值为当前年份。在这种情况下,您最好使用应用程序代码(Laravel模型)来提供默认值。

如果默认值是静态值,则在迁移中设置是最佳选择。对于计算值,应使用boot方法。

您可能需要在此行的末尾添加"->change()",如下所示:$table->tinyInteger('role')->default(1)->change()

所以,在Laravel模型上设置属性的默认值可以通过在迁移中设置默认值,或者在模型中使用boot方法计算默认值。对于某些RDBMS,可能需要使用应用程序代码来提供默认值。

0
0 Comments

在Laravel模型中设置属性的默认值是一个常见的需求。在这篇文章中,我们将探讨这个问题的原因以及解决方法。

问题的原因是,当我们创建一个新的模型实例时,有时我们希望某些属性具有默认值。这样可以避免在每次创建实例时都手动设置这些属性的值。

解决方法有两种。

第一种方法是在模型中使用$attributes属性。我们可以在$attributes数组中为属性设置默认值。例如,在模型中添加以下代码:

protected $attributes = [
    'status' => self::STATUS_UNCONFIRMED,
    'role_id' => self::ROLE_PUBLISHER,
];

通过这种方式,当我们创建一个新的模型实例时,'status'属性将自动被设置为self::STATUS_UNCONFIRMED,'role_id'属性将自动被设置为self::ROLE_PUBLISHER。

第二种方法是使用访问器和修改器。访问器和修改器允许我们在设置和获取属性值时进行额外的处理。我们可以在模型中定义修改器,当给定属性的值被设置时,自动调用修改器并进行处理。例如,在模型中添加以下代码:

public function setUserTypeAttribute($value){
    $this->attributes['user_type'] = 'User';
}

通过这种方式,当我们设置'user_type'属性的值时,将自动调用setUserTypeAttribute方法,并将属性的值设置为'User'。

总结起来,这两种方法都可以实现属性的默认值设置。根据具体需求选择合适的方法即可。使用$attributes属性可以在创建新的模型实例时自动设置默认值,而使用修改器可以在设置属性值时进行自定义处理。

希望本文能帮助你解决关于在Laravel模型中设置属性默认值的问题。如果有任何疑问,请随时提问。

0
0 Comments

在Laravel模型上设置属性的默认值的问题是因为无法直接在迁移中设置默认值。解决方法是在模型的"booting"方法中使用事件来自动设置属性的值。以下是解决方法的代码示例:

/**
 * The "booting" method of the model.
 *
 * @return void
 */
protected static function boot()
{
    parent::boot();
    // auto-sets values on creation
    static::creating(function ($query) {
        $query->is_voicemail = $query->is_voicemail ?? true;
    });
}

这个解决方法适用于在创建新的Voicemail模型时将is_voicemail属性设置为true。如果在创建时is_voicemail属性为null,则会自动将其设置为true。

此解决方法还适用于解决无法为文本列设置空字符串默认值的问题。更多关于此问题的信息可以在stackoverflow.com/questions/3466872/…找到。

您可以在github.com/laravel/framework/blob/7.x/src/Illuminate/Database/…laravel.com/docs/7.x/eloquent#events找到关于此解决方法的更多文档。

这个解决方法也可以处理一些复杂的默认值,例如计算得到的值,比如UUID字符串,因为无法直接将值Str::uuid()分配给$attributes属性。

总之,这是一个非常聪明的解决方法,适用于在Laravel模型中设置属性的默认值。

0