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
方法并进行更改。您可以在 BaseClass
、traits 等中使用这些方法。例如在您的 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。如果不清楚,请告诉我。
我创建了一个 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
方法并进行更改。您可以在 BaseClass
、traits 等中使用这些方法。例如在您的 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。如果不清楚,请告诉我。