Laravel 8 Eloquent关联查询返回空数组,原生SQL却有结果
Laravel 8 Eloquent查询返回空集合问题
数据表结构
表menus
| ID | MENU |
|---|---|
| 1 | Menu1 |
| 2 | Menu2 |
表role_has_menu
| ROLE_ID | MENU_ID |
|---|---|
| 1 | 1 |
| 1 | 2 |
原生SQL查询正常返回结果
执行以下原生SQL:
select * from "MENUS" inner join "ROLE_HAS_MENU" on "MENUS"."ID" = "ROLE_HAS_MENU"."MENU_ID" WHERE ROLE_ID='1'
得到正确结果:
| ID | MENU | ROLE_ID | MENU_ID |
|---|---|---|---|
| 1 | Menu1 | 1 | 1 |
| 2 | Menu2 | 1 | 2 |
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
相关产品推荐
相关产品推荐

