Laravel 5.5如何将GET参数传递给Yajra Datatables的AJAX请求?
解决Laravel 5.5中Yajra Datatables传递URL GET参数的问题
我来帮你搞定这个问题!在Laravel 5.5里把URL上的GET参数(比如lead_name、lead_phone)传给Yajra Datatables的AJAX请求其实很简单,分前端和后端两步来做就行:
一、前端:在Datatables初始化时附加GET参数
在你的results.blade.php视图里,初始化Datatables的时候,通过AJAX配置的data回调函数,把URL里的查询参数合并到请求数据中。这里有两种常用方式:
方式1:自动传递所有URL查询参数
这种方式会把当前页面URL上的所有GET参数都传给Datatables的AJAX接口,适合参数较多或者后续可能新增参数的场景:
$(document).ready(function() { $('#your-table-id').DataTable({ processing: true, serverSide: true, ajax: { url: "{{ route('datatables.results') }}", // 替换成你的Datatables路由 data: function(d) { // 读取当前URL的所有查询参数,合并到Datatables的请求数据里 const urlParams = new URLSearchParams(window.location.search); for (const [key, value] of urlParams.entries()) { d[key] = value; } } }, // 你的表格列配置... columns: [ { data: 'lead_name', name: 'lead_name' }, { data: 'lead_phone', name: 'lead_phone' }, // 其他列... ] }); });
方式2:只传递指定的参数
如果你只需要传递特定的几个参数(比如lead_name和lead_phone),可以手动提取并添加:
$(document).ready(function() { // 从URL中提取目标参数 const urlParams = new URLSearchParams(window.location.search); const leadName = urlParams.get('lead_name'); const leadPhone = urlParams.get('lead_phone'); $('#your-table-id').DataTable({ processing: true, serverSide: true, ajax: { url: "{{ route('datatables.results') }}", data: function(d) { // 只把需要的参数加到请求里 if (leadName) d.lead_name = leadName; if (leadPhone) d.lead_phone = leadPhone; } }, // 列配置... }); });
二、后端:接收参数并应用到查询
在你的Datatables控制器方法中,接收前端传过来的参数,然后把它们作为查询条件加到你的模型查询里:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Yajra\DataTables\Facades\DataTables; use App\Models\YourModel; // 替换成你的模型类 class YourController extends Controller { public function getResults(Request $request) { // 获取前端传递的参数 $leadName = $request->input('lead_name'); $leadPhone = $request->input('lead_phone'); // 构建基础查询 $query = YourModel::query(); // 根据参数添加筛选条件 if ($leadName) { $query->where('lead_name', 'like', "%{$leadName}%"); } if ($leadPhone) { $query->where('lead_phone', 'like', "%{$leadPhone}%"); } // 返回Datatables格式的数据 return Datatables::of($query) ->addColumn('action', function($row) { // 这里可以添加操作按钮,比如查看、编辑 return '<a href="'.route('lead.show', $row->id).'" class="btn btn-sm btn-primary">查看详情</a>'; }) ->rawColumns(['action']) // 允许HTML内容 ->make(true); } }
三、路由配置
别忘了在routes/web.php里配置你的Datatables路由:
Route::get('results/datatables', [YourController::class, 'getResults'])->name('datatables.results');
另外还有个小技巧:如果你的结果页面已经能通过Laravel的request()助手拿到参数,也可以直接在blade里把参数拼到AJAX的URL上,比如:
ajax: "{{ route('datatables.results', [ 'lead_name' => request()->lead_name, 'lead_phone' => request()->lead_phone ]) }}",
不过这种方式不如前面的回调函数灵活,适合参数固定的场景。
这样配置完之后,Datatables的AJAX请求就会带上你URL里的GET参数,后端也能根据这些参数筛选数据啦!
内容的提问来源于stack exchange,提问作者ahinkle
相关产品推荐
相关产品推荐

