Laravel - 扩展模型

Laravel - Extending Model

我创建了一个 BaseModel class,它从 Model.似乎一切正常,但现在我 运行 在保存时遇到了问题。我正在覆盖此 BaseModel 中的 save() 方法。我只想在保存之前向模型添加一些属性。所以我这样做,然后调用 return parent::save($options);。方法签名仍然相同:public function save(array $options = [])

它似乎在执行插入时为 table 名称获取 BaseModel class 的名称(它使用 base_models 作为 table 名称),而不是正在保存的实际模型。有人 运行 以前参与过这个吗?从模型 class 扩展的正确方法是什么?

我最初创建了一些特征来处理一些额外的功能,但我认为最好只创建一个基本模型并让我的模型从中扩展。

在您的模型(扩展基础模型的子模型)中明确添加 table 名称,例如:

class SomeChildModel extends BaseModel {

    // Manually set the table name
    protected $table = 'table_name';

}

我意识到我以前有一个静态方法,它使用 new self() 创建自身的实例并设置一些属性,回到我使用特征中的方法时。以前没问题,但现在自从我将方法移入基本模型后,该方法实际上是在基本模型本身而不是具有特征的 class 上调用的。

我基本上是使用静态方法来实例化 class,正如我所读到的那样,这是避免使构造函数混乱的一种方法。但这次我只是选择在构造函数中执行它,因为它有意义,所以这就是我的解决方案。

Laravel默认使用class名字的snake case(调用save方法的class),如果没有$table实例变量已设置。在您的情况下,它将使用 BaseModel 的蛇形大小写作为 table 名称。您有两个解决方案:

解决方案 1:

在扩展 BaseModel 的 classes 中添加 $table 实例变量如下:

class User extends BaseModel {
    protected $table = 'table_name'; // Your table name in the database;
}

解决方案 2:

您可以使用 Laravel Eloquent's Events,它允许您挂接到模型生命周期中的各个点。

您可以按如下方式连接到 save 方法并进行更改。您可以在 BaseClasstraits 等中使用这些方法。例如在您的 BaseModel:

class BaseModel extends Model
{
    /**
     * Listen for save event
     */
    protected static function boot()
    {
        parent::boot();

        static::saving(function($model)
        {
            if ( ! $model->isValid()) {
                return false;
            }
        });
    }
}

在将模型保存到存储之前,上面的代码总是会调用 isValid。在这种情况下,它将 return false 并且不会保存对象。

有关详细信息,请在此处查看官方 docs。如果不清楚,请告诉我。