You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取一对多关联关系的结果数组?Laravel关联查询问题

问题解决步骤

1. 修正User模型的关联方法

你的关联定义存在两处错误:

  • 模型类名拼写错误:userDevicess::class 应为 UserDevice::class(遵循Laravel模型命名规范,表名user_devices对应模型名UserDevice)
  • hasMany 参数错误:第二个参数是关联表的外键(即user_devices表中指向users表的字段user_id),而非表名

修正后的关联代码:

public function userDevices()
{
    return $this->hasMany(UserDevice::class, 'user_id');
}

2. 修正控制器的查询逻辑

你要筛选的device_id属于user_devices表,直接用where('device_id')会查询users表的字段(该表无此字段),导致查询失败。需用whereHas过滤关联数据,同时若需要加载符合条件的关联设备,可配合with的闭包:

场景1:仅获取拥有指定设备的用户(无需加载设备数据)

$users = User::whereHas('userDevices', function($query) use ($request) {
    $query->where('device_id', $request->device_id);
})->get();

// 遍历输出用户邮箱
foreach($users as $user) {
    echo $user->email;
}

场景2:获取用户同时加载其指定的设备数据

$users = User::with(['userDevices' => function($query) use ($request) {
    // 仅加载符合条件的设备
    $query->where('device_id', $request->device_id);
}])
->whereHas('userDevices', function($query) use ($request) {
    // 筛选出拥有该设备的用户
    $query->where('device_id', $request->device_id);
})
->get();

// 遍历输出用户邮箱
foreach($users as $user) {
    echo $user->email;
    // 若需要访问该用户的指定设备,可使用 $user->userDevices
}

原代码失效原因总结

  • 关联方法中模型类名拼写错误、外键参数传错,导致关联关系无法正确建立
  • 控制器查询错误地将device_id作为users表字段进行筛选,而该字段仅存在于user_devices表
  • 若$user是单个User实例,调用get()会触发错误查询逻辑,应从User模型类出发进行集合查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:34