Eloquent模型关联速记表
学习链接
xueyuanjun.com/post/9725
xueyuanjun.com/post/9726
Eloquent 模型支持的关联关系包括以下七种:
- 一对一
建立关联关系:hasOne
建立相对的关联关系:belongsTo
一对多
hasMany
belongsTo多对多
远层一对多
多态关联(一对一)
多态关联(一对多)
多态关联(多对多)
| 关联方式 | 建立关联关系 | 建立相对的关联关系|表情况|
| ———— | ———— |———— |———— |
| 一对一 | hasOne |belongsTo | 一对一 两张表 一条数据对应一条数据 |
| 一对多 | hasMany| belongsTo |两个模型 一条数据对应多个信息|
| 多对多 | belongsToMany| belongsToMany |两个模型但是会创建三个表,一个标只存关系|
| 远层一对多 | hasManyThrough| belongsToMany |
| 多态关联(一对一) | belongsToMany| belongsToMany |
| 多态关联(一对多) | belongsToMany| belongsToMany |
| 多态关联(多对多) | belongsToMany| belongsToMany |
场景
RBAC。
自行理解就行。
关联查询
懒惰式加载(动态属性)
下面这种方式就是懒惰式加载:
$post = Post::findOrFail(1);
$author = $post->author;
优点,无脑。
缺点性能差。因为每次开始查询都去链接数据库查关联表。
渴求式加载(通过with方法)
优点: 性能更优,因为它会提前从数据库一次性查询所有关联数据
缺点: 可能因为不太无脑?
统计关联模型
withCount
方法在不加载关联模型的情况下统计关联结果的数量
多对多关联的绑定与解除(没有关联关系如何绑定?又如何解除)
将两个本来没有关联关系的记录绑定起来 attach
解除这个关联关系可以通过 detach
方法实现
更新子模型如何触发父模型时间戳更新?
以时间为列:
子模型中配置 $touches 属性:
// 要触发更新的父级关联关系
protected $touches = [
'commentable'
];
结语
好了,关于关联关系我们就介绍到这里,我们分了三篇的篇幅来介绍 Eloquent 模型的管理关系,回顾一下,主要包含以下内容:
- 七种关联关系的定义:一对一、一对多、多对多、远层一对多、一对一的多态关联、一对多的多态关联、多对多的多态关联;
- 以上关联关系的查询,主要包含两种方式:懒惰式加载和渴求式加载;
- 基于关联查询构架复杂查询对查询结果进行过滤;
- 关联模型的更新、插入和删除操作。
感谢
再次感谢学院君老师,让我能快速的学习laravel 这些很好用的用法,平时看手册,比较晦涩。也容易下意识的遗漏这些知识点。