如何在Laravel查询中程序化添加WHERE子句?
解决方案
不用编写原生SQL,Laravel查询构造器完全能实现多关键词的动态条件添加,按以下方式修改即可:
完整代码示例
// 假设你的关键词数组为 $keywords(比如从请求中获取:$keywords = request('keywords', []);) // 先过滤空关键词,避免生成无效的 LIKE 条件 $keywords = array_filter($keywords); // 初始化查询构造器,先构建基础查询逻辑 $query = DB::table('docs_text') ->select([ 'documents.id', 'documents.filename', 'documents.extension', 'documents.description', 'documents.created_at', 'documents.url' ]) ->join('documents', 'docs_text.doc_id', '=', 'documents.id') ->groupBy([ 'documents.id', 'documents.filename', 'documents.extension', 'documents.description', 'documents.created_at', 'documents.url' ]) ->orderBy('created_at'); // 循环添加每个关键词的 LIKE 条件 foreach ($keywords as $keyword) { $query->where('doc_text', 'like', "%{$keyword}%"); } // 执行查询并获取结果 $docs = $query->get();
关键说明
- 先将查询构造器实例存入变量
$query,不要直接链式调用到get(),这样就能动态追加条件。 - Laravel中连续调用
where默认会生成AND逻辑,和你手动写andWhere效果完全一致。 array_filter用来过滤空关键词,避免出现LIKE '%%'这种无意义的条件。- 这种方式会自动处理SQL注入风险,Laravel会将关键词作为绑定参数,而非直接拼接进SQL语句。
可选优化:OR逻辑匹配
如果后续需要改成任意关键词匹配(OR逻辑),可以用闭包实现:
$query->where(function ($q) use ($keywords) { foreach ($keywords as $keyword) { $q->orWhere('doc_text', 'like', "%{$keyword}%"); } });
内容的提问来源于stack exchange,提问作者randy
相关产品推荐
相关产品推荐

