文章转发于专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...刚开始用Laravel开发的时候,感觉在实施模型时,有很多事情可以用更好的方式完成。在探索了Eloquent的模型类之后,我发现你可以用你的模型做一些有趣的事情,这让你的生活更轻松。在这篇文章中,我将为每个使用Laravel的人提供7个技巧,以了解如何充分利用您的模型。1首先,让我们开始创建模型当我们通过命令行创建模型时,可以指定在某个文件夹中创建这个模型。您所要做的就是在模型名称之前输入文件夹的名称。当您的模型未存储在默认应用程序文件夹中时,这很有用。phpartisanmake:modelModels/Product现在将在app/Models文件夹中创建一个Product模型,这样可以节省您将模型移动到符合条件的文件夹的时间。2转换属性类型$casts属性提供了将属性转换为特定数据类型的方法。受保护的$casts=['is_published'=>'boolean'];is_publish属性现在将在您访问它时转换为布尔值,即使它作为整数存储在您的数据库中也是如此。还有很多方法可以将属性转换为其他类型,例如date和datetime。我经常看到的一种不当行为是在Blade模板文件中格式化日期和日期时间,如下所示:在同一个变量上多次。使用$casts属性可以更有效地解决这个问题。对于日期和日期时间转换属性,您可以指定以下格式:protected$casts=['published_at'=>'datetime:Y-m-d',];这将始终以Y-m-d格式返回published_at属性,因此您不再需要在Blade模板文件中进行任何格式化。3是否可见某些属性不应包含在模型的数组或JSON表示中,例如密码属性。这就是$hidden属性发挥作用的地方。protected$hidden=['password'];$hidden*属性就像一个属性黑名单。或者,您也可以使用*$visible属性来设置属性白名单。protected$visible=['first_name','last_name'];当在模型中设置$visible*属性时,其他属性将自动隐藏。这就像*$fillable和$guarded属性一样工作。4Accessors有时你想把多个属性合二为一,或者你只是想格式化属性。这时我们就可以使用Laravel的访问器了。假设您有一个User模型,并且它们具有first_name和last_name属性。如果你想显示全名,你可以这样做:$this->first_name。''。$this->last_name这是一种非常幼稚的做法。在Laravel中解决这个问题的方法是使用访问器。访问器将使用以下语法在模型上定义一个方法:get[NameOfAttribute]Attribute获取全名的访问器如下所示:publicfunctiongetFullNameAttribute(){return"{$this->first_name}{$this->last_name}";}要获取全名的值你只需要像这样调用访问器:$user->full_name5修饰符修饰符允许你操作值并在模型的*$attributes*属性操作上设置价值。变量与访问器具有相同的语法。公共函数setLastNameAttribute($value){$this->attributes['last_name']=ucfirst($value);}该修改器会将*ucfirst*函数应用于姓氏,并将结果存储在*$attributes*属性中。$user->last_name='琼斯';//结果将是`Jones`6附加值当模型具有访问器和模型关联时,默认情况下它们不会添加到模型的数组或JSON表示中。为此,您需要将访问器或模型关联添加到模型的$appends属性。现在让我们使用getFullNameAttribute访问器继续这个例子:$appends=['full_name'];注意:添加到$appends属性的访问器在snakecase中被引用,即使访问器是在camelCase中定义的。假设User模型与Blog模型具有一对多关系。publicfunctionblogs(){return$this->hasMany(App\Blog::class);}要将博客添加到模型中,只需将它们添加到$appends属性中:$appends=['full_name','博客'];当然,我们可以指定添加的属性。例如,如果您只需要将博客的id和标题添加到模型中。$appends=['full_name','blogs:id,title'];7最后的润色当一个模型与另一个模型有BelongsTo或BelongsToMany关系时,例如,Comment属于Blog,在某些情况下,在更新子数据时同时更新父的时间戳可能很有用。这个问题可以通过将关系添加到$touches属性来解决。classCommentextendsModel{protected$touches=['blog'];publicfunctionblog(){return$this->belongsTo(App\Blog::class);当Comment模型更新时,Blog模型也会更新updated_at属性。
