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 - 它不包含,因为您的类 AIlluminate\Database\Eloquent\Model。到目前为止一切顺利 - 但现在您正在扩展 Model 并且您可以覆盖 protected $fillable 属性。继承规则允许这样做。您的问题是有效的,但文档的摘录也是如此。 【参考方案1】:

您不能像 PHP 文档建议的那样覆盖同一类中的 trait 属性。

然而,Laravel 要求您在子类中覆盖它(您的模型类扩展了 Eloquent 模型类,并且特性包含在 Eloquent 模型类中,而不是您的模型类中)。这是一件非常有效的事情!

【讨论】:

以上是关于Laravel/Eloquent 建议覆盖 trait 属性?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 支持 MariaDb 动态专栏

laravel eloquent 的特殊 UUID 主键

Laravel Eloquent:检测为空或计数

Laravel Eloquent OR WHERE IS NOT NULL

如果另一个连接为空,Laravel Eloquent 和 Mysql 连接一个表

如何在laravel eloquent中为左连接表起别名