Laravel多表查询使用表别名时如何正确显示主客队名称
代码修正方案
你现有代码存在拼写错误、别名缺失、变量未定义、模板属性调用错误四类问题,按以下方式调整即可正常展示主客队名称与比赛结果:
修正原生SQL脚本
原SQL存在表名拼写错误(mattch/mtach为match笔误)、末尾多余反引号问题,且match是MySQL保留字,需要用反引号包裹避免语法报错,修正后代码:
select `match`.ID, `match`.ht_ID, ht.Name as ht_Name, `match`.at_ID, at.Name as at_Name, match_results.Results from match_results join `match` on `match`.ID = match_results.Match_ID join teams ht on `match`.ht_ID = ht.ID join teams at on `match`.at_ID = at.ID
修正Laravel控制器查询逻辑
原控制器代码存在三个核心问题:
- 表名写错:查询的结果表是
match_results而非results - select字段语法错误:
ht.Name前缺失单引号,且未给主客队名称字段设置别名,无法在模板中直接区分 - 查询结果未赋值给
$result变量,会触发未定义变量报错
修正后代码:
$result = DB::table('match_results') ->select( 'match.ID', 'ht.Name as ht_Name', 'at.Name as at_Name', 'match_results.Results' ) ->join('match', 'match.ID', '=', 'match_results.Match_ID') ->join('teams as ht', 'match.ht_ID', '=', 'ht.ID') ->join('teams as at', 'match.at_ID', '=', 'at.ID') ->get(); return view('results', ['result' => $result]);
修正Blade模板代码
使用DB门面查询返回的是扁平化的标准对象,不存在嵌套的ht/at模型对象,不能使用$results->ht.Name的嵌套调用写法;同时原模板中比赛结果字段拼写错误(Rezultats为笔误),修正后代码:
@foreach($result as $results) <tr> <td>{{ $results->ID }}</td> <td>{{ $results->ht_Name }}</td> <td>{{ $results->at_Name }}</td> <td>{{ $results->Results }}</td> </tr> @endforeach
内容的提问来源于stack exchange,提问作者EBo
相关产品推荐
相关产品推荐

