You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:52:13