Laravel多表关联查询如何嵌套获取评论关联的用户数据
Laravel 嵌套关联(帖子-评论-用户)查询实现
你当前使用的是Laravel Eloquent ORM的预加载功能,要实现多层嵌套关联查询,直接利用预加载的点语法即可,不需要写复杂的join语句,具体操作如下:
1. 修改预加载参数声明嵌套关联
把原查询里的with('comments')改成with('comments.user'),Eloquent会自动按层级加载「帖子下的所有评论」+「每条评论对应的用户信息」,修改后的查询代码如下:
$post = Posts::where('id', $id)->with('comments.user')->first();
2. 确认Comments模型中已定义User关联
嵌套预加载生效的前提是App\Models\Comments模型中提前定义了和User模型的关联关系,评论与用户是从属关系,关联方法示例如下:
// 写在Comments模型内部 public function user() { // 请根据实际表字段调整参数: // 第一个参数为关联模型路径,第二个是评论表存储用户ID的外键字段,第三个是用户表的主键字段 return $this->belongsTo('App\Models\User', 'userId', 'id'); }
扩展:需要自定义关联查询条件的写法
如果后续需要对评论、关联用户加筛选规则(比如只查审核通过的评论、只查正常状态的用户),可以用闭包嵌套的写法自定义关联查询逻辑:
$post = Posts::where('id', $id) ->with([ 'comments' => function($commentQuery) { // 仅查询审核通过的评论 $commentQuery->where('status', 1) ->with([ 'user' => function($userQuery) { // 仅查询未被封禁的用户 $userQuery->where('is_banned', 0); } ]); } ]) ->first();
查询完成后遍历$post->comments时,每条评论对象下会自动挂载user属性,直接访问就能拿到对应的用户数据,不会产生N+1查询问题。
内容的提问来源于stack exchange,提问作者Sprep
相关产品推荐
相关产品推荐

