Laravel8项目中如何通过id获取单行数据并解决外键查询异常问题
问题根因
- 原有路由
view-beat/{beat_slug}/{license_slug}会传递2个路径参数,但初始viewlicense方法仅定义了1个$id参数,实际拿到的$id仅为第一个路径参数beat_slug,完全没有使用第二个路径参数license_slug做License数据筛选 - 初始License查询逻辑
License::where('beat_id', $id)->first()永远只会取对应beat下的第一条License记录,和实际访问的license参数无关,所以出现不同license路径展示同一条数据的问题
调整后代码逻辑说明
调整后的代码已经修复了上述问题:
viewlicense方法正确接收两个路径参数$beat_slug和$license_slug,先校验对应beat是否存在,再通过license_slug精准查询匹配的单条License数据,保证路径参数和返回数据一一对应viewbeat方法中使用get()获取对应beat下的所有License列表,符合License列表页的展示需求
可选优化建议
可以给License查询额外增加beat_id筛选条件,避免不同beat下出现重复license_slug时查询错误,同时减少重复查询次数:
public function viewlicense($beat_slug, $license_slug) { $beat = Beat::where('slug', $beat_slug)->first(); if (!$beat) { return redirect('/')->with('Status', "No such beat found"); } // 同时按beat_id和license_slug筛选,数据更准确 $licenses = License::where('slug', $license_slug)->where('beat_id', $beat->id)->first(); if (!$licenses) { return redirect('/')->with('Status', "The link was broken"); } return view('frontend.licenses.view', compact('licenses')); }
内容的提问来源于stack exchange,提问作者pajay
相关产品推荐
相关产品推荐

