laravel限定条件下的搜索

自从转了前端 就很少再碰后端的代码 SQL查询等也变得很不熟悉
这次帮师弟写一个软件杯的项目, 涉及到搜索,居然浪费了很多时间,实在不该,特地写下来当做一个教训,也当给自己记个笔记

业务情景描述

  • 通过书籍的各种信息搜索书籍显示列表
  • 分类对应列表
  • 分类内搜索列表

解决问题的思路

限定图书分类 + 各种字段的like

本来是很简单的一个操作 结果给我写成了 全是 OR 查询 真想锤死我自己

通过花了点时间搜索 这边也顺便提一下 搜索的时候 搞懂自己想要查询的知识点 描述清楚自己的问题 列出重点关键词 是很重要的

否则就算你用 google 也不一定能找到你想要的东西 一开始把问题分析清楚 了解自己需要的 是很重要的

比如我刚刚遇到的问题 总结为一句话功能需求: laravel限定条件搜索
分词为: laravel 限定条件 搜索 (laravel condition + search)

google中文搜索结果为 第七条 PHP框架Laravel Eloquent ORM where 多条件查询- SegmentFault 用户 jefferywang 答案中含有符合了我想要的东西

google英文搜索结果为 第二条 laravel elequent query with multiple conditions based on user search/filter 标题符合预期 最后一条回答中提到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Try this
News::where("is_active", 1)
->where('type', Input::get("type"))
->where('category', Input::get("category"))
->get();
// or if you want only active news with other or conditions.
News::where("is_active", 1)
->orWhere(function($query)
{
$query->where('type', Input::get("type"))
->where('category', Input::get("category"))
})->get();
Check out advanced where

还很贴心的给了一个官方文档的高级where查询的链接
然后我对比中文的文档where查询 参数分组
推荐不熟悉英文的使用laravel-china

通过合理的分析问题 拆分搜索关键词(中英文都应该尝试) 从而找到了正确的解决方案

最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$data = Book::with(['classify', 'classify.parent'])->where('classify_id', '=', request('classify_id'))
->where(function ($q) {
$queryStr = request('query');
$q->where('title', 'like', '%' . $queryStr . '%')
->where('tags', 'like', '%' . $queryStr . '%')
->orWhere('initial', 'like', '%' . $queryStr . '%')
->orWhere('spell', 'like', '%' . $queryStr . '%')
->orWhere('subtitle', 'like', '%' . $queryStr . '%')
->orWhere('author', 'like', '%' . $queryStr . '%')
->orWhere('summary', 'like', '%' . $queryStr . '%')
->orWhere('catalog', 'like', '%' . $queryStr . '%')
->orWhere('publisher', 'like', '%' . $queryStr . '%')
->orWhere('isbn10', 'like', '%' . $queryStr . '%')
->orWhere('isbn13', 'like', '%' . $queryStr . '%');
})
->paginate(request('limit'));

从这次遇到的问题 以及解决时间上来说 证明了我 PHP 实在是太久没写了 生疏得连 SQL 都懒得去思考了 却一开始就从框架层面找解决方案 更加理想的解决思路应该是先分析 SQL 正常查询是怎样的 再去找框架对应的快捷方法 或者 不快捷? 反正就是解决问题的方案
路漫漫其修远兮 吾将上下而求索

坚持原创技术分享,您的支持将鼓励我继续创作!