laravel Eloquent:关联

laravel 官方文档这一页很长,讲了很多东西,大概分为四个部分, 关联,关联查询,预加载,操作关联模型,更新时间戳, 前面三个比较常用,第四个没看懂,他讲了怎样添加关联和更新关联,这还是能理解的,但是又说道解除关联关系,懵逼,为什么要解除?如果你懂,请下面留言,很感谢。下面我大概总结一下前面三个,常用的,关联,关联查询,预加载。

定义关联

它介绍了很多种情况,一对一,一对多,多对多,远层一对多,多态,多对多多态,听上去很懵逼,其实结合场景,很容易理解。
一对一 :用户 对 用户的个人信息
一对多: 文章 对 文章的评论
多对多 : 关联表 比如一个权限管理 权限表 用户表 用户权限表
远层一对多: 中国 对 省 对 市 这里的 中国 和市 就是他说的远层
多态: 文章有评论, 视频有评论, 所有的评论都在评论表 通过id关联, 这就是多态
多对多多态: 没有耐心看下去

逻辑就是这样的,还有就是反向关联,其实是一个道理,这里需要注意的是,每种关联的参数,还有反向关联的参数,如果你觉得不好记住位置,要先理解has 和 belong,和外键, 你在写代码的时候 编辑器会提示你这个位置要写什么,A有B, 通过一个键连接,这个外键就是A的id, A属于B,通过一个外键连接 那这个外键就是B的id。

关联查询

    $posts = Post::whereHas('comments', function ($query) {
        $query->where('content', 'like', 'foo%');
    })->get();

如上面的代码,在post中,肯定有个 comments 为方法名的关联存在,这行代码翻译成人话就是, 我要查询Post, 什么样的呢,就是用我事先定义好的comments关联查关联数据,查出来的数据不是空的, 然后在这个基础上,再加上乱七八糟的条件。

预加载

场景: 比如 每个合同有很多账单 你定义了一个关联,contract hasMany bill

image.png

语句打印出的语句如下


image.png

但是,假如这么写


image.png

语句是下面这样
image.png

这就是预加载,还有所谓的n+1问题。

推荐阅读更多精彩内容