【问题标题】:Laravel way to add a column value on all models like created_atLaravel 在 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 钩子填充该列。如果有人可以指导我使用特征和如何完成这样的事情?

【问题讨论】:

    标签: php laravel eloquent model traits


    【解决方案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!您还可以在将来将此基类重用于其他全局逻辑。

    【讨论】:

    • 我知道这一点,并在我的问题中提到了这一点。我想要一些使用特征的方法,所以我不必更改所有模型。
    • 向所有模型添加特征将是相同的工作量和基本相同的逻辑,您可以对特征执行相同操作,尽管只需覆盖特征中的引导方法并可选地调用如果您需要额外的自定义逻辑,则具有不同特征的新静态方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多