2

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

在执行插入时,它似乎在获取 BaseModel 类的名称作为表名(它使用 base_models 作为表名),而不是正在保存的实际模型。有没有人遇到过这个?从模型类扩展的正确方法是什么?

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

4

3 回答 3

2

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

class SomeChildModel extends BaseModel {

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

}
于 2015-11-07T07:43:18.703 回答
0

我意识到我以前有一个静态方法,它使用 new self() 创建自己的实例,并且会设置一些属性,当我使用来自 trait 的方法时。以前没问题,但现在因为我将方法移到基础模型中,该方法实际上是在基础模型本身而不是具有特征的类上调用的。

我基本上是使用静态方法来实例化类,因为我已经读过它是避免使构造函数混乱的一种方法。但是这次我只是选择在构造函数中执行它,因为它是有道理的,所以这就是我的解决方案。

于 2015-11-07T08:14:04.947 回答
0

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

解决方案1:

在扩展类中BaseModel添加$table实例变量,如下所示:

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

解决方案2:

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

您可以按以下方式挂钩该save方法并进行更改。您可以在您的BaseClass特征等中使用这些方法。例如在您的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在将模型保存到存储中之前,上述内容将始终调用。在这种情况下,它将返回 false 并且不会保存对象。

有关更多信息,请参阅此处的官方文档。如果不清楚,请告诉我。

于 2015-11-07T08:47:13.280 回答