Laravel新手求教:如何在Eloquent模型中结合join与where查询多表
嘿,刚接触Laravel碰到关联问题太正常啦!我先帮你把已有的两张表关联理清楚,再给你说说带条件关联多张表的通用思路——毕竟你提到的表3结构不全,我就拿最常见的场景举例啦~
第一步:先搞定基础的两张表关联
首先咱们得在模型里定义好users和articles的关联关系(明显是一对多:一个用户可以写多篇文章):
在User模型里添加关联方法:
// app/Models/User.php public function articles() { return $this->hasMany(Article::class); }
在Article模型里添加反向关联:
// app/Models/Article.php public function user() { return $this->belongsTo(User::class); }
带条件的多表关联查询场景
假设表3是comments(评论表,常见的关联场景),结构大概是id, content, article_id, user_id, timestamps(),咱们来看看几种常见的带条件关联需求:
1. 过滤主模型:只保留满足关联条件的记录(用whereHas)
比如你想查询所有发布过标题含“Laravel”关键词文章的用户,或者想找那些文章有特定评论的用户,就用whereHas:
// 示例1:找所有有标题带"Laravel"文章的用户 $users = User::whereHas('articles', function ($query) { $query->where('title', 'like', '%Laravel%'); })->get(); // 示例2:找所有文章里有含"干货"评论的用户 $users = User::whereHas('articles.comments', function ($query) { $query->where('content', 'like', '%干货%'); })->get();
⚠️ 注意:用嵌套关联(articles.comments)时,得先在Article模型里定义好和Comment的关联:
// app/Models/Article.php public function comments() { return $this->hasMany(Comment::class); }
2. 加载带条件的关联数据(用with+闭包)
如果你不想过滤用户本身,只是想加载用户数据时,只附带满足特定条件的关联文章(比如只加载用户最近7天发布的文章),就这么写:
$users = User::with(['articles' => function ($query) { $query->where('created_at', '>=', now()->subDays(7)); }])->get();
这种方式会返回所有用户,但每个用户的articles属性里只有符合条件的文章。
3. 复杂场景用原生联表查询(join)
如果你的条件涉及多表字段的复杂判断,也可以用原生的join语法:
$users = User::join('articles', 'users.id', '=', 'articles.user_id') ->where('articles.title', 'like', '%Laravel%') ->select('users.*', 'articles.title as article_title') // 可选,指定要查询的字段 ->get();
要是表3是其他类型?比如分类表
假设表3是categories(分类表),还有中间表article_category(文章分类关联表),那就是多对多关联,处理逻辑类似:
先在Article模型里定义多对多关联:
// app/Models/Article.php public function categories() { return $this->belongsToMany(Category::class); }
然后查询所有发布过“教程”分类文章的用户:
$users = User::whereHas('articles.categories', function ($query) { $query->where('name', '教程'); })->get();
内容的提问来源于stack exchange,提问作者Colt
相关产品推荐
相关产品推荐

