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

Laravel 8 Eloquent关联查询返回空数组,原生SQL却有结果

Laravel 8 Eloquent查询返回空集合问题

数据表结构

表menus

IDMENU
1Menu1
2Menu2

表role_has_menu

ROLE_IDMENU_ID
11
12

原生SQL查询正常返回结果

执行以下原生SQL:

select * from "MENUS" inner join "ROLE_HAS_MENU" on "MENUS"."ID" = "ROLE_HAS_MENU"."MENU_ID" WHERE ROLE_ID='1'

得到正确结果:

IDMENUROLE_IDMENU_ID
1Menu111
2Menu212

Laravel 8查询构建器返回空集合

执行以下Eloquent代码时,返回空集合:

$query = DB::table('MENUS')->join('role_has_menu', 'menus.id', '=', 'role_has_menu.menu_id')->where('role_has_menu.role_id','=','1')->get();

返回结果:

Illuminate\Support\Collection {#289 ▼
  #items: []
  #escapeWhenCastingToString: false
}

问题原因及解决方案

问题出在表名和字段名的大小写不匹配。如果数据库运行在区分大小写的环境(比如Linux系统下的MySQL,默认表名区分大小写),原生SQL中使用的是全大写的表名MENUS、ROLE_HAS_MENU和字段名ID、MENU_ID,但Laravel查询中混合使用了大写表名和小写的字段/关联表名,导致数据库无法匹配到对应的表和字段,最终返回空集合。

修改后的查询代码,保持大小写与原生SQL一致即可:

$query = DB::table('MENUS')
    ->join('ROLE_HAS_MENU', 'MENUS.ID', '=', 'ROLE_HAS_MENU.MENU_ID')
    ->where('ROLE_HAS_MENU.ROLE_ID', '=', '1')
    ->get();

也可以统一使用小写表名(如果数据库实际表名为小写),确保所有表名和字段名的大小写与数据库中的实际定义完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:22:52