关于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_id
和follower_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::class
和Guanzhu::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...
推荐文章: