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

Posted

技术标签:

【中文标题】Laravel 在 created_at 等所有模型上添加列值的方法【英文标题】:Laravel way to add a column value on all models like created_at 【发布时间】:2021-11-04 23:38:09 【问题描述】:

我需要在我的一些数据库表中添加一列并将其填充到Model::create()

我想要的只是 timestamps 中内置的 Laravel 之类的功能,即 created_atupdated_at

我知道一些解决方案,但我想知道在这种情况下是否可以做其他事情。 例如:

protected static function booted()

    static::created(function ($user) 
        //
    );

class UserObserver

    public function creating(User $user)
    
        //
    

我需要对每个重复自己的模型都这样做。

我想到的另一个解决方案是创建一个BaseModel,然后扩展它的所有内容。


我想做一些类似SoftDeletes trait 的事情,在其中添加任何逻辑并使用我不知道的一些 laravel 钩子填充该列。如果有人可以指导我使用特征和如何完成这样的事情?

【问题讨论】:

【参考方案1】:

您可以从一个基本模型类(一个小的重构)扩展您的所有模型,然后在该类中添加一个带有您的自定义逻辑的引导方法。

如果您在使用引导方法的模型(例如用户模型)中需要(或已经拥有)额外逻辑,您仍然可以保留它,但请确保调用 parent::booted();

class BaseModel extends Model 
    protected static function booted()
    
        static::created(function ($model) 
            //logic
        );
    


class User extends BaseModel 
    protected static function booted()
    
        parent::booted();
        //any other logic you may have/want in user
    

在我看来,这是最具可扩展性的方法。使用 OOP!您还可以在将来将此基类重用于其他全局逻辑。

【讨论】:

我知道这一点,并在我的问题中提到了这一点。我想要一些使用特征的方法,所以我不必更改所有模型。 向所有模型添加特征将是相同的工作量和基本相同的逻辑,您可以对特征执行相同操作,尽管只需覆盖特征中的引导方法并可选地调用如果您需要额外的自定义逻辑,则具有不同特征的新静态方法

以上是关于Laravel 在 created_at 等所有模型上添加列值的方法的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 选择所有具有 max created_at 的行

如何在 Laravel 中更新 created_at 的列属性

如何在 laravel 5.4 中仅获取 created_at 日期而不是时间

Laravel / Moment - 如何确定夏令时期间是不是 created_at?

Laravel 中 created_at 和 updated_at 列的优点是啥

将 created_at 列添加到迁移表 - Laravel