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

Laravel LIKE搜索:如何实现全表搜索而非指定列搜索

在Laravel中实现全表列的LIKE搜索

嘿,这个需求我做项目时也碰到过,其实有几种灵活的实现方式,给你详细说说:

方法一:直接获取表列并构建OR查询

最直接的方式是先拿到对应表的所有列名,然后循环给每个列添加OR LIKE条件:

use Illuminate\Support\Facades\Schema;
use App\Models\Post; // 替换成你的实际模型

$searchKeyword = '要搜索的内容';
// 动态获取模型对应表的所有列名
$tableColumns = Schema::getColumnListing((new Post())->getTable());

// 初始化查询构造器
$query = Post::query();

// 遍历列名,拼接OR LIKE条件
foreach ($tableColumns as $column) {
    $query->orWhere($column, 'LIKE', "%{$searchKeyword}%");
}

// 执行查询获取结果
$searchResults = $query->get();

这里用Schema::getColumnListing()动态获取列名,不用手动写死,后续表结构变更也不用修改搜索逻辑。

方法二:封装成模型Scope,复用更优雅

如果多个业务场景需要全列搜索,把逻辑封装成模型的Scope会更方便维护:

// 在你的模型文件(比如app/Models/Post.php)中添加Scope方法
use Illuminate\Support\Facades\Schema;

public function scopeSearchAllColumns($query, $searchTerm)
{
    $tableColumns = Schema::getColumnListing($this->getTable());
    
    foreach ($tableColumns as $column) {
        $query->orWhere($column, 'LIKE', "%{$searchTerm}%");
    }
    
    return $query;
}

之后使用时就非常简洁:

$searchResults = \App\Models\Post::searchAllColumns('你的搜索关键词')->get();

进阶优化:排除不需要搜索的列

通常我们不需要搜索id、created_at这类字段,可以加个过滤逻辑:

$excludeColumns = ['id', 'created_at', 'updated_at', 'deleted_at']; // 自定义需要排除的列
$tableColumns = array_diff(
    Schema::getColumnListing((new Post())->getTable()),
    $excludeColumns
);

额外技巧:只搜索字符串类型的列

如果不想搜索数字、日期类型的列,可以通过列类型过滤:

$tableColumns = collect(Schema::getColumnListing((new Post())->getTable()))
    ->filter(function ($column) {
        // 只保留字符串类型的列
        return Schema::getColumnType((new Post())->getTable(), $column) === 'string';
    })
    ->toArray();

注意事项

  • 性能提示:如果是数据量很大的表,全列LIKE搜索会比较慢(无法利用索引),这种情况建议考虑MySQL的全文索引(Laravel支持whereFullText方法)或者用Elasticsearch这类专业搜索工具。
  • 安全说明:不用担心SQL注入,Laravel的查询构造器会自动转义搜索关键词,确保安全。

内容的提问来源于stack exchange,提问作者user9330768

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:34:54