Laravel同系列书籍查询问题:点击《哈利波特1》无法获取其他系列书籍
问题分析
你的查询失效原因很明确:当前代码里的where('title', 'like', '%' . $book->title. '%')是在找包含完整"Harry Potter Part 1"字符串的书籍,但同系列的《哈利波特2》书名是"Harry Potter Part 2",显然不包含"Harry Potter Part 1",所以查不到任何结果。
解决方案
你需要匹配的是同系列的共同前缀,而非完整书名,以下是几种可行的实现方式:
方式1:提取前缀做模糊匹配
从当前书籍标题中拆分出系列前缀,再用前缀匹配同系列书籍:
public function book(Request $request) { $book = books::find($request->id); // 拆分标题,提取"Harry Potter Part"这个共同前缀 $titleParts = explode(' ', $book->title); $seriesPrefix = implode(' ', array_slice($titleParts, 0, 3)); return [ 'book' => $book, 'more_books' => books::whereNotIn('id', [$book->id]) ->where('title', 'like', $seriesPrefix . '%') ->get() ]; }
方式2:正则匹配固定格式的系列名
如果书名格式固定为「系列名 Part 数字」,可以用正则匹配开头一致的书籍:
public function book(Request $request) { $book = books::find($request->id); return [ 'book' => $book, 'more_books' => books::whereNotIn('id', [$book->id]) ->where('title', 'regexp', '^Harry Potter Part') ->get() ]; }
方式3:优化数据库结构(长期最优方案)
如果频繁需要按系列查询,建议给books表新增series_id字段,专门标记书籍所属系列。这样查询更高效,也避免了字符串处理的麻烦:
// 新增series_id字段后的查询代码 public function book(Request $request) { $book = books::find($request->id); return [ 'book' => $book, 'more_books' => books::where('series_id', $book->series_id) ->whereNotIn('id', [$book->id]) ->get() ]; }
验证效果
修改后,点击《哈利波特1》时,more_books会返回所有同系列的其他书籍,比如《哈利波特2》《哈利波特3》等。
内容的提问来源于stack exchange,提问作者Nashwan
相关产品推荐
相关产品推荐

