Laravel 8 两表join关联查询无结果 非关联查询正常问题求助
问题排查方案及修复建议
核心原因分析
添加join后dd不执行的核心原因是查询触发了SQL错误,被外层try{}catch{}捕获后直接走了异常返回分支,所以dd()语句未被执行,错误日志会记录在你配置的custom_log通道中,可先查看日志确认具体报错。
分步排查&修复
- 第一步:验证生成的SQL是否正确
在join查询的->get()之前插入->toSql(),打印最终生成的SQL语句,复制到数据库客户端直接执行,即可直观看到是语法错误还是无匹配数据:
$racc = Raccomandata::select('*', 'sap_abilitati.SAP') ->join('sap_abilitati', 'sap_abilitati.id', '=', 'raccomandata.idCliente') ->where([ ['isGenerated', '=', '0'], ['created_at', '>', $date.' 00:00:00'], ['idCliente', '=', $request->input('sap')], ]) ->toSql(); dd($racc);
- 第二步:修复字段歧义问题
两表关联查询时,where条件中使用的字段如果在两张表中都存在(比如常见的id、created_at、updated_at等),必须指定所属表,否则数据库会报Column 'xxx' in where clause is ambiguous错误,修改where条件如下:
->where([ ['raccomandata.isGenerated', '=', '0'], ['raccomandata.created_at', '>', $date.' 00:00:00'], ['raccomandata.idCliente', '=', $request->input('sap')], ])
- 第三步:优化select字段避免覆盖
你当前使用select('*', 'sap_abilitati.SAP')会导致两张表的同名字段被覆盖,建议明确指定主表字段,避免数据异常:
->select('raccomandata.*', 'sap_abilitati.SAP')
- 第四步:调整join类型适配业务需求
当前你使用的是join(即内连接inner join),只有raccomandata.idCliente和sap_abilitati.id完全匹配的记录才会返回,如果存在idCliente没有对应关联表数据的场景,需要保留主表数据的话,改成左连接即可:
->leftJoin('sap_abilitati', 'sap_abilitati.id', '=', 'raccomandata.idCliente')
- 第五步:修复groupBy字段问题
查询结果中sap_abilitati.SAP字段已经被取出,groupBy时直接使用字段名即可,不需要带表前缀。
修复后完整代码示例
// GESTIONE DELLE SPEDIZIONI public function gestisciSpedizione(Request $request){ try{ set_time_limit(-1); //prendo la data odierna, devo spedire quelle con data precedente. $date = date('Y-m-d'); if($request->input('sap') != 'all'){ //recupero le raccomandate $racc = Raccomandata::select('raccomandata.*', 'sap_abilitati.SAP') ->leftJoin('sap_abilitati', 'sap_abilitati.id', '=', 'raccomandata.idCliente') ->where([ ['raccomandata.isGenerated', '=', '0'], ['raccomandata.created_at', '>', $date.' 00:00:00'], ['raccomandata.idCliente', '=', $request->input('sap')], ]) ->get(); $racc = $racc->groupBy(['SAP', 'idCommessa', 'cronologico'])->toArray(); dd($racc); return \App::call('App\Http\Controllers\ExportFileController@exportXML', ['racc'=>$racc, 'all' => '0']); }else{ // TODO } Log::channel('custom_log')->info('L\'utente '.Auth::user().' ha prenotato con successo la spedizione numero: '.$request->input('codice_prenotazione').' FILE :'); return redirect()->back()->with('success', 'Prenotazione della spedizione effettuata con successo'); }catch(\Exception $e){ Log::channel('custom_log')->info('L\'utente '.Auth::user().' non è riuscito a prenotare la spedizione COD:'.$request->input('codice_prenotazione').' ERRORE:'.$e); return redirect()->back()->with('error', 'Non è stato possibile prenotare la spedizione numero: '.$request->input('codice_prenotazione')); } }
内容的提问来源于stack exchange,提问作者64Bit1990
相关产品推荐
相关产品推荐

