phpMyAdmin执行SQL结果正确,Laravel8运行相同逻辑查询结果异常
问题原因
核心原因是多表联查时的同名字段覆盖:
- 原生SQL在phpMyAdmin中执行时,会完整返回两张表的全部字段,即使存在
id、created_at这类两张表共有的同名字段,也会区分展示 - Laravel查询构造器执行查询后,会将结果集转换为对象/数组结构,此时同名字段的后出现值会覆盖先出现值,join关联时关联表的同名字段默认会覆盖主表的同名字段,最终得到错误的字段值。
解决方法
1. 明确指定查询字段并给同名字段设置别名(最推荐)
不要使用隐式的select *查询,按需指定需要返回的字段,对不同表的同名字段设置单独别名:
public function index() { $bill = DB::table('bills') ->join('bills_categories', 'bills.id', '=', 'bills_categories.bill_id') // 按需指定字段,同名字段加别名区分 ->select('bills.*', 'bills_categories.id as category_id', 'bills_categories.name as category_name') ->get(); return $bill; }
2. 验证生成的SQL逻辑
如果需要确认查询构造器的逻辑是否正确,可以使用toSql()方法输出生成的原生SQL,和手动写的SQL做对比:
echo DB::table('bills') ->join('bills_categories', 'bills.id', '=', 'bills_categories.bill_id') ->toSql();
打印出的SQL和你手动写的原生SQL完全一致,可以进一步确认问题出在结果集的同名字段覆盖逻辑上。
内容的提问来源于stack exchange,提问作者Ehab Reda
相关产品推荐
相关产品推荐

