如何在 Laravel 模型上设置属性的默认值 [重复]

Posted

技术标签:

【中文标题】如何在 Laravel 模型上设置属性的默认值 [重复]【英文标题】:How to set the default value of an attribute on a Laravel model [duplicate] 【发布时间】:2017-02-16 03:58:25 【问题描述】:

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

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

【问题讨论】:

***.com/questions/18747500/… 【参考方案1】:

你也可以在模型中设置默认属性>

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

您可以在这些链接中找到详细信息

1.) How to set a default attribute value for a Laravel / Eloquent model?

2.) https://laracasts.com/index.php/discuss/channels/eloquent/eloquent-help-generating-attribute-values-before-creating-record


您也可以为此使用 Accessors & Mutators 您可以在 Laravel 文档中找到详细信息 1.) https://laravel.com/docs/4.2/eloquent#accessors-and-mutators

2.) https://scotch.io/tutorials/automatically-format-laravel-database-fields-with-accessors-and-mutators

3.) Universal accessors and mutators in Laravel 4

【讨论】:

谢谢,设置默认属性可以正常工作,因为受保护的 $attributes = [ 'status' => self::STATUS_UNCONFIRMED, 'role_id' => self::ROLE_PUBLISHER, ];但作为 Mutators 它不起作用,例如公共函数 setUserTypeAttribute($value) $this->attributes['user_type'] = 'User';我想问一下这些方法是否有任何区别,或者哪种方法最好。 两者都更好。由你决定。在 mutator 中,我给了你一个例子,你可以在 empty or custom 的情况下设置默认值。像 public function setUserTypeAttribute($value) $this->attributes['user_type'] = empty($value) ? 'User' : $value; 我希望你能理解这个例子。 @Zeeshan Bin Iqbal 这解决了您的问题吗? 使用 mutator 不会很有效,因为 mutator 只有在你为属性赋值时才会被调用。因此,如果您根本没有为该属性分配值,那么它实际上不会具有您想要的默认值。 我希望我能给你投票两次。【参考方案2】:

其他答案对我不起作用 - 它们可能已过时。这是我用作自动设置属性的解决方案:

/**
 * 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;
    );

【讨论】:

这太棒了 我还应该指定我尝试在迁移中使用默认值。上面的这个例子来自一个语音邮件模型,它扩展了一个录音模型,所以他们使用同一个表。创建新的语音邮件模型时,is_voicemail 设置为 true。 我只需要设置一个值,如果它在创建时通过为 null,所以这对我很有用 @nishilbhave github.com/laravel/framework/blob/7.x/src/Illuminate/Database/… laravel.com/docs/7.x/eloquent#events 迄今为止我在 *** 上看到的最聪明的东西!【参考方案3】:

你应该在migrations中设置默认值:

$table->tinyInteger('role')->default(1);

【讨论】:

例如,当使用模型进行表单验证时,您希望在将其保存到数据库之前拥有一个默认值。在使用您的示例时,您需要将记录添加到数据库中,然后才能检索到默认值,这很麻烦。 更不用说 一些 列类型不允许使用默认值(例如文本) 很多新手谷歌,找到这个问题并支持 Manish 的回答(并且反对我的回答),但我仍然相信 best practice 是在迁移类中做到这一点如果可能。此外,当您验证表单并且需要创建一个新行然后从 DB 中获取一些默认值时,我想不出这种情况,如 Innovaat 之前所述。在表单验证期间获取任何类型的默认值对我来说听起来像是在重新发明***。 问题问,如何在模型上设置默认值。它不询问如何在数据库中设置默认值。这些是不同的东西,很多时候你可能想new一个模型而不参考数据库 虽然这可能是 RDBMS 的最佳实践,但 OP 并未指定他使用的数据库。在无模式设置中,这不适用。

以上是关于如何在 Laravel 模型上设置属性的默认值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

laravel 模型 - 如何在模型中动态设置列值?

如何在 Code First 模型中的布尔值上设置默认值?

Laravel 保护列免受不可为空/默认值的批量分配

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

在使用 tinker CLI 时,Laravel 如何在 Eloquent 模型上查找和显示动态属性?

laravel 路由参数的默认值怎么设置