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

Posted

技术标签:

【中文标题】laravel 模型 - 如何在模型中动态设置列值?【英文标题】:laravel model - how to dynamically set a column value in the Model? 【发布时间】:2017-10-04 22:12:32 【问题描述】:

创建用户时,例如在控制器中使用以下行:

$user = $this->create($request->all());

这将插入带有表单值(姓名、电子邮件、密码等)的用户记录。

但是如果我们想在模型和数据库表上设置一个“隐藏”的用户字段/列,例如一个特殊的唯一生成令牌(user.token),我们不想在每个控制器中都这样做。

如果 laravel 有服务层,可以在这里完成,但最好在模型本身中完成。

例如通过捕获 beforeSave 回调,并让一些代码生成令牌并在将其写入数据库之前设置相应的字段。我看到模型已经保存()事件/观察者,但这看起来像是在保存之后发生的,我不想把这个逻辑放在外部类中,它属于模型,文档没有说观察者可以修改模型(在这种情况下通过设置列)

有什么建议吗?

【问题讨论】:

您的意思是为始终设置的列实现设置器,例如名称,并在其中输入代码以设置其他列,例如令牌?它有点破解,但可能会工作...... 另外值得注意的是,一个属性被隐藏了,并不意味着它不能被填充。只需将其添加到您的 fillable 数组中,和/或将其从您的 guarded 数组中删除即可。 【参考方案1】:

可以直接在模型中定义事件监听器。例如。将boot 方法添加到您的User 模型中:

/**
 * Define model event callbacks.
 *
 * @return void
 */
public static function boot()

    parent::boot();

    static::saving(function ($model) 
        $model->token = str_random(60);
    );

替代的,更详细的实现:

/**
 * Define model event callbacks.
 *
 * @return void
 */
public static function boot()

    parent::boot();

    static::saving(function ($model) 
        if (method_exists($model, 'beforeSave')) $model->beforeSave();
    );


/**
 * Before save event listener.
 *
 * @return void
 */
public function beforeSave()

    $this->token = str_random(60);

【讨论】:

嗨,感谢您的回复。如果我在我的模型中添加一个函数说“beforeSave()”,我可以通过你的引导方法调用它吗?所以模型逻辑在一个地方(未来的开发者永远不会在启动时找到它)。这将类似于 grails。在 grails 中,我可以只向模型添加方法(例如自动调用的“beforeUpdate”。thx. 如果未来的开发者使用 Laravel,希望他们看看 那个 框架是如何实现事件的,而不是假设它会类似于不同的语言/框架。这些是 Eloquent 模型中的 available events。您可以使用这些,或者如果您愿意,也可以编写自己的事件层。

以上是关于laravel 模型 - 如何在模型中动态设置列值?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询,其中列值大于相关模型列值的总和

Laravel Eloquent 模型按局部列和关系模型列值排序

Laravel 在 created_at 等所有模型上添加列值的方法

如何在 laravel 4.2 中动态更改模型表?

如何签入 ::whereHas 查询某个列值?拉拉维尔

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