关于belongsToMany方法解析和关联自身的自我理解

belongsToMany方法解读

    public function followers()//我的粉丝者列表
    {
        return $this->belongsToMany(User::class, 'followers', 'user_id', 'follower_id');
    }

    public function followings()//我的关注者列表
    {
        return $this->belongsToMany(User::class, 'followers', 'follower_id', 'user_id');
    }

首先我们先来解析下belongsToMany这个方法我们用到的这四个参数(其他的先不要管,这里没用到,你有空再去研究)
第1个参数是 要关联的模型
第2个参数是 建立多对多关联的中间表名
第3个参数是 中间表中当前模型类的外键
第4个参数是 中间表中当前关联模型类的外键

为什么User模型要关联自己?

user_idfollower_id 都是 user 的主键 ID,只是在逻辑上,user_id 表示被关注人,follower_id 表示被关注人的粉丝,followers 表作为中间表存储了这个关系,它的两个关联表恰好是同一个表,即 users 表。
–出自@truesnow

怎么理解

我们可以这么理解,把users表克隆成2份,分别是关注者表(Guanzhu.php)和粉丝者表(Fensi.php),他们分别储存了所有的关注者和粉丝者。

在粉丝者列表里面要把user_id这个字段名改成follower_id

#Guanzhu.php
    public function followers()//我的粉丝者列表
    {
        return $this->belongsToMany(Fensi::class, 'followers', 'user_id', 'follower_id');
    }
#Fensi.php
    public function followers()//我的关注者列表
    {
        return $this->belongsToMany(Guanzhu::class, 'followers', 'follower_id', 'user_id');
    }

这样看起来是不是就没那么绕了!因为关注者表和粉丝者表的本质就是users表,咱们回过头来,再把Fensi::classGuanzhu::class换成User::class是不是就和老师写的一样了!

看看laravel生成的SQL

followers方法查询 粉丝者列表 生成的sql是

SELECT
    `users`.*,
    `followers`.`user_id` AS `pivot_user_id`,
    `followers`.`follower_id` AS `pivot_follower_id`
FROM
    `users`
INNER JOIN `followers` ON `users`.`id` = `followers`.`follower_id`
WHERE
    `followers`.`user_id` = "1"

followings方法查询 关注者列表 生成的sql是

SELECT
    `users`.*,
    `followers`.`user_id` AS `pivot_user_id`,
    `followers`.`follower_id` AS `pivot_follower_id`
FROM
    `users`
INNER JOIN `followers` ON `users`.`id` = `followers`.`follower_id`
WHERE
    `followers`.`user_id` = "1"

这里有比较详细的讲解Eloquent 模型关联关系的文档,更多细节性问题这里有答案laravelacademy.org/post/9717#toc-1...

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

这儿确实有点饶,我还又回去看了一遍文档,你这解释的很详细。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!