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

基于SQL Server的jQuery DataTables Select2多筛选器问题求助

解决SQL Server下jQuery DataTables + Select2多选筛选的REGEXP报错问题

问题核心

你的报错根源是SQL Server不支持MySQL的REGEXP语法,而DataTables服务器端模式下,使用search()方法的正则参数(第二个参数设为true)会生成带REGEXP的SQL语句,直接触发数据库语法错误。

解决方案

因为是服务器端处理(serverSide: true),筛选逻辑必须在Laravel后端实现,前端仅负责传递选中的筛选值。以下是两种可行方案:


方案一:通过自定义AJAX参数传递筛选值

这种方式更直观,直接将多选值作为数组传给后端,后端用whereIn构建查询。

前端代码修改
<select id="filter1" data-column="0" data-column_name="filter1_column" class="form-select filter-select" multiple>
    @foreach($values as $val)
        <option value="{{$val}}">{{$val}}</option>
    @endforeach
</select>
var table = $('#test-table').DataTable({
    "scrollX": true,
    "scrollY": true,
    "processing": true,
    "serverSide": true,
    "ajax": {
        url: "{{route('test.index')}}",
        data: function(d) {
            // 遍历所有筛选下拉框,将选中值添加到请求参数
            $('.filter-select').each(function() {
                var colName = $(this).data('column_name');
                var selected = $('option:selected', this).map(function() {
                    return $(this).val();
                }).toArray();
                
                if (selected.length > 0) {
                    d[`${colName}_filter`] = selected;
                }
            });
        }
    },
    "columns": [
        {"data": "values1"},
        {"data": "values2"},
    ]
});

// 下拉框变化时重新加载表格
$('.filter-select').change(function() {
    table.ajax.reload();
});
Laravel后端代码(基于yajra/laravel-datatables)
use Illuminate\Http\Request;
use Yajra\DataTables\Facades\DataTables;
use App\Models\YourModel;

public function index(Request $request)
{
    if ($request->ajax()) {
        $query = YourModel::query();

        // 处理filter1_column的多选筛选
        if ($request->has('filter1_column_filter')) {
            $selectedVals = $request->input('filter1_column_filter');
            $query->whereIn('filter1_column', $selectedVals);
        }

        // 其他列的筛选同理添加

        return DataTables::of($query)->toJson();
    }

    // 获取筛选选项值(根据实际业务调整)
    $values = YourModel::pluck('filter1_column')->unique();
    return view('test.index', compact('values'));
}

方案二:修改搜索值格式,后端解析后处理

这种方式沿用DataTables的search()方法,但自定义搜索值格式,后端识别后替换为whereIn查询。

前端代码修改
$('.filter-select').change(function () {
    var selectedVals = $('option:selected', this).map(function(index, element) {
        return $(element).val();
    }).toArray();
    
    // 自定义搜索前缀,让后端识别是多选筛选
    var searchStr = selectedVals.length > 0 ? `IN:${selectedVals.join(',')}` : '';
    
    table.column($(this).data('column'))
         .search(searchStr)
         .draw();
});
Laravel后端代码
use Yajra\DataTables\Facades\DataTables;

public function index(Request $request)
{
    if ($request->ajax()) {
        $query = YourModel::query();

        return DataTables::of($query)
            // 针对filter1_column列处理筛选逻辑
            ->filterColumn('filter1_column', function($query, $keyword) {
                if (str_starts_with($keyword, 'IN:')) {
                    // 解析出多选值,用whereIn查询
                    $vals = explode(',', substr($keyword, 3));
                    $query->whereIn('filter1_column', $vals);
                } else {
                    // 普通模糊搜索(可选)
                    $query->where('filter1_column', 'LIKE', "%{$keyword}%");
                }
            })
            ->toJson();
    }

    $values = YourModel::pluck('filter1_column')->unique();
    return view('test.index', compact('values'));
}

关键说明

  1. 服务器端模式下,DataTables的search()方法会将搜索值传递给后端,由后端构建SQL查询,因此不能依赖前端的正则逻辑。
  2. SQL Server支持WHERE IN语法处理多选匹配,这是最适合此类场景的方式,性能也比多个OR条件更好。
  3. 如果使用原生Laravel查询而非yajra包,核心逻辑依然是:接收前端传递的多选值,用whereIn过滤查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:09:24