Laravel/Eloquent 建议覆盖 trait 属性?
Posted
技术标签:
【中文标题】Laravel/Eloquent 建议覆盖 trait 属性?【英文标题】:Laravel/Eloquent advises to override a trait property? 【发布时间】:2017-07-10 22:24:09 【问题描述】:我在 Laravel 5.4 中使用 Eloquent 模型 在文档中,我看到:
您也可以使用 create 方法将新模型保存在单个 线。插入的模型实例将从 方法。但是,在这样做之前,您需要指定一个 与所有 Eloquent 模型一样,模型上的可填充或受保护属性 默认情况下防止批量分配。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name'];
但是,$fillable 属性已经定义在所有模型使用的特征中:
trait GuardsAttributes
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [];
...
PHP 文档对 Traits 属性很清楚:
如果一个 trait 定义了一个属性,那么一个类就不能定义一个属性 同名,否则报错。如果是 E_STRICT 类定义是兼容的(相同的可见性和初始值) 否则会出现致命错误。
Laravel 文档中关于 adivsed 的实现是否有误?
【问题讨论】:
两者都没有错。你有类A
并且你在该类中使用了一个特征。 Trait = 语言辅助复制粘贴。 A
类不能包含 protected $fillable
- 它不包含,因为您的类 A
是 Illuminate\Database\Eloquent\Model
。到目前为止一切顺利 - 但现在您正在扩展 Model
并且您可以覆盖 protected $fillable
属性。继承规则允许这样做。您的问题是有效的,但文档的摘录也是如此。
【参考方案1】:
您不能像 PHP 文档建议的那样覆盖同一类中的 trait 属性。
然而,Laravel 要求您在子类中覆盖它(您的模型类扩展了 Eloquent 模型类,并且特性包含在 Eloquent 模型类中,而不是您的模型类中)。这是一件非常有效的事情!
【讨论】:
以上是关于Laravel/Eloquent 建议覆盖 trait 属性?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 支持 MariaDb 动态专栏
Laravel Eloquent OR WHERE IS NOT NULL