Laravel hasManyThrough关联user_id异常问题求助
解决Laravel中hasManyThrough获取关注用户帖子时user_id异常的问题
嘿,我来帮你搞定这个问题!你要实现登录用户关注的人的帖子信息流,思路本身是对的,但大概率是在hasManyThrough的关联定义上搞混了外键和本地键的对应关系,才导致返回的user_id出现异常。
先给你贴出正确的关联写法,直接放到User.php模型里就行:
// app/Models/User.php public function followedPosts() { return $this->hasManyThrough( Post::class, Follow::class, 'user_id', // 中间表Follow中,关联当前登录用户的外键(即谁在关注) 'user_id', // 目标表Post中,关联被关注用户的外键(即帖子是谁发的) 'id', // 当前User表的本地键(登录用户的ID) 'target_id' // 中间表Follow中,关联被关注用户的本地键(即被关注的人ID) ); }
为什么原来的写法会出问题?
hasManyThrough的参数顺序很容易搞混,我给你拆解下每个参数的意义:
- 第一个参数:最终要获取的模型(这里就是
Post,我们要的帖子) - 第二个参数:中间关联模型(这里是
Follow,记录关注关系的表) - 第三个参数:中间表关联主模型的外键——也就是
Follow表中,哪一列对应当前登录用户的ID(user_id,因为是当前用户在关注别人) - 第四个参数:目标表关联中间表的外键——也就是
Post表中,哪一列对应被关注用户的ID(user_id,因为帖子是被关注用户发的) - 第五个参数:主模型的本地键(
User表的id) - 第六个参数:中间表关联目标表的本地键——也就是
Follow表中,哪一列对应被关注用户的ID(target_id)
你之前的问题应该是把第3/4参数或者第6参数搞反了,导致关联时错误地把当前用户的ID绑定到了帖子的user_id上,所以返回的user_id才会异常。
怎么使用这个关联?
在控制器里直接调用就行,比如:
// 获取登录用户关注的人的帖子,按最新排序 $followedPosts = auth()->user()->followedPosts()->latest()->get();
调试小技巧
如果还是有问题,你可以打印出生成的SQL语句,检查关联条件是否正确:
dd(auth()->user()->followedPosts()->toSql());
正常生成的SQL应该包含类似这样的关联条件:
inner join `follows` on `follows`.`user_id` = `users`.`id` inner join `posts` on `posts`.`user_id` = `follows`.`target_id`
如果看到posts.user_id关联的是follows.user_id,那就是参数搞反了,调整下就能解决。
另外顺便提醒下:如果你的Follow模型使用了非默认表名(比如不是follows),记得在模型里设置$table属性指定正确的表名哦。
内容的提问来源于stack exchange,提问作者Melvin Hagberg
相关产品推荐
相关产品推荐

