Skip to content

Laravel Eloquent 关联模型使用技巧

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

天下武功没有高下之分,只是习武之人有强弱之别。

上一篇介绍了 Laravel Eloquent 模型的基本使用技巧 Laravel Eloquent 模型 使用技巧 ,这篇介绍_Laravel Eloquent 关联模型使用技巧_

关联模型

返回默认模型

这个特别重要!!!能避免关联数据不存在时导致的致命错误。

比如,我们可以在 belongsTo 关系中设置返回一个默认的模型,从而避免类似于使用 \{\{ $post->user->name \}\} 当 $post->user 不存在的时候,引起的致命的错误。

csharp
public function user() {     return $this->belongsTo('App\User')->withDefault(); }

在 Eloquent 关系中使用 OrderBy

可以在关联关系中直接指定 orderBy ()

比如设置关联关系的制售,指定根据name字段排序

kotlin
public function products() {     return $this->hasMany(Product::class); } public function productsByName() {     return $this->hasMany(Product::class)->orderBy('name'); }

在 Eloquent 关系中添加条件

如果我们经常在模型关联关系中添加某些相同的 where 条件,可以抽取成一个独立方法。

指定和评论关联关系的同时,设置了approved=1,外部在调用的时候就可以直接调用这个方法了。

kotlin
//指定和评论的关联关系 public function comments() {     return $this->hasMany(Comment::class); } //指定和评论关联关系的同时,设置了approved=1,外部在调用的时候就可以直接调用这个方法了。 public function approved_comments() {     return $this->hasMany(Comment::class)->where('approved', 1); }

DB 原生查询: havingRaw ()

我们可以在很多地方使用原始数据库查询,比如在 groupBy() 后面调用 havingRaw()

css
Goods::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

Eloquent 使用 has () 实现多层调用查询

我们可以在关联关系查询中使用 has() 实现两层关联查询。

css
// Teacher -> hasMany(Class::class); // Class -> hasMany(Student::class); $teachers = Teacher::has('classes.students')->get();

一对多关系中获取符合指定数量的数据

在一对多关系中,我们可以通过条件过滤,获取符合的数据。

比如需要查找有哪些老师负责的班级数量大于 5。

css
// Teacher -> hasMany(Class::class) $teachers = Teacher::has('classes', '>', 5)->get();

一对多关系中一次创建多条关联数据

在一对多关系中,我们可以使用 saveMany() 通过一次提交,保存多条关联数据。

css
$article = Article::find(1); $article->comments()->saveMany([    new Comment(['message' => 'First comment']),     new Comment(['message' => 'Second comment']), ]);

多层级渴求式加载

在 Laravel 中,我们可以在一条语句中渴求式加载多个层级。

在下述例子中,我们不仅加载作者关系,而且还加载作者模型上的国家关系。

css
$users = App\Book::with('author.country')->get();

渴求式加载特定字段

我们可以在 Laravel 中渴求式加载并指定关联中的特定字段。

css
$users = App\Book::with('author:id,name')->get();

我们还可以在深层级中这样做,如第二层级关系:

css
$users = App\Book::with('author.country:id,name')->get();

欢迎互动

欢迎大家点赞关注,大佬们有啥好的建议欢迎在评论区指教

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情