
本文详细介绍如何在 Laravel 中使用 Yajara DataTable 实现基于单日期(非区间)的精准服务端筛选,通过前端日期选择器联动 Ajax 请求,后端按 whereDate 精确匹配指定日期的数据记录。
本文详细介绍如何在 laravel 中使用 yajara datatable 实现基于单日期(非区间)的精准服务端筛选,通过前端日期选择器联动 ajax 请求,后端按 `wheredate` 精确匹配指定日期的数据记录。
在实际业务中,常需对数据表进行动态日期筛选——例如仅显示「2023年10月7日」当天创建的所有记录,而非日期范围。Yajara DataTable 默认不内置日期筛选逻辑,需手动集成前端控件与后端查询。以下是完整、可落地的实现方案。
✅ 前端:添加日期选择器并注入筛选参数
在视图中插入标准 HTML5 ,确保其 name 与控制器接收字段一致:
<div class="form-group mb-3">
<label for="selected_date" class="form-label">选择日期:</label>
<input type="date" class="form-control" id="selected_date" name="selected_date">
</div>
随后,在初始化 DataTable 的 JavaScript 中,通过 ajax.data 将选中日期作为额外参数传递给服务端:
$('#datatable').DataTable({
processing: true,
serverSide: true,
ajax: {
url: '/admin/orders/data', // 替换为你的实际路由
method: 'GET',
data: function (d) {
d.selected_date = $('#selected_date').val() || '';
}
},
columns: [
{ data: 'id', name: 'id' },
{ data: 'title', name: 'title' },
{ data: 'created_at', name: 'created_at', render: function (data) {
return moment(data).format('YYYY-MM-DD HH:mm');
}},
// 其他列...
]
});
? 提示:建议配合 moment.js 或原生 Intl.DateTimeFormat 格式化时间列,提升可读性。
✅ 后端:服务端精确日期过滤
在控制器方法中,使用 Laravel 的 whereDate() 方法(自动忽略时间部分),精准匹配 created_at(或你实际的时间字段)的日期值:
use Yajra\DataTables\Facades\DataTables;
use App\Models\Order; // 替换为你的模型
public function getData(Request $request)
{
$selectedDate = $request->input('selected_date');
$query = Order::query();
// 仅当用户选择了有效日期时才应用筛选
if (!empty($selectedDate) && \Carbon\Carbon::createFromFormat('Y-m-d', $selectedDate)->isValid()) {
$query->whereDate('created_at', $selectedDate);
}
return DataTables::of($query)
->addColumn('action', function ($row) {
return '<a href="'.route('orders.show',%20%24row->id).'">查看</a>';
})
->rawColumns(['action'])
->make(true);
}
⚠️ 关键注意事项:
- whereDate() 会将数据库字段(如 created_at)的日期部分与 $selectedDate(格式 Y-m-d)严格比对,自动忽略时分秒,完美满足“仅当天”的需求;
- 务必校验 $selectedDate 的合法性(如使用 Carbon::createFromFormat()->isValid()),避免 SQL 错误或空查询;
- 若使用 MySQL 以外的数据库(如 PostgreSQL),whereDate() 仍兼容,Laravel 会自动适配底层语法;
- 路由需注册为 GET(因 DataTable 默认 Ajax 使用 GET),并确保该路由已分配 web 中间件(含 session 支持)。
✅ 进阶建议
- 可结合 date_default_timezone_set() 统一时区,避免因服务器/数据库时区差异导致日期错位;
- 如需支持「清空筛选」,可在 JS 中监听日期输入框的 change 事件,触发 DataTable .draw() 刷新;
- 对高频查询场景,建议为 created_at 字段添加数据库索引:$table->index('created_at');。
通过以上三步,即可零侵入地为 Yajara DataTable 添加简洁、健壮的单日期筛选能力,兼顾用户体验与服务端性能。











