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
相关产品推荐
相关产品推荐

