You need to enable JavaScript to run this app. Laravel 如何查询符合roles.user_id=1条件的users表数据
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 如何查询符合roles.user_id=1条件的users表数据

问题核心原因

当前查询结果异常的本质是关联定义完全错位,没有匹配实际的表结构外键关系:

  • 你在User模型中定义的Role关联,逻辑是“当前用户的ID对应Role表的user_id,一个用户对应多个角色”,这个关系实际表达的是“哪个用户创建了哪些角色”,和你需要的“用户本身绑定了哪个角色”的业务逻辑完全相反
  • 原查询的关联匹配条件是users.id = roles.user_id,而非实际的users.role_id = roles.id,所以筛选时只会把Role表中user_id=1的行拉出来,无法正确匹配users表的关联记录
修正步骤

1. 重写User模型的所属角色关联

按照实际表结构,users表通过role_id字段关联roles表的主键id,是一对一的所属关系,替换原错误的关联代码:

public function role()
{
    // 关联类型为belongsTo,本地键是users.role_id,对应关联表的主键roles.id
    return $this->belongsTo('App\Models\Role', 'role_id', 'id');
}

2. (可选)在Role模型中补充创建者关联

如果后续需要追溯角色的创建人,可在Role模型中补充对应关联,方便扩展查询:

public function creator()
{
    // roles表的user_id 对应 users表的主键id,表达“角色由哪个用户创建”的关系
    return $this->belongsTo('App\Models\User', 'user_id', 'id');
}

3. 替换正确的查询逻辑

按照“查询所有user_id=1的管理员创建的角色所对应的用户”的需求,用修正后的关联编写查询:

$users = User::with('role')
    ->whereHas('role', function ($query) {
        // 筛选条件:当前用户绑定的角色,其创建者ID为1
        $query->where('user_id', 1);
    })
    ->get();

按照你给出的表测试数据,该查询最终会返回users表中id为2、3的两条用户记录,完全匹配需求;原错误查询因为关联条件错位,拉取的Role数据和用户自身绑定的角色无关,看起来就像只返回了roles表中user_id=1的行,无法带出正确的users表数据。

内容的提问来源于stack exchange,提问作者user3653474

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 06:06:09