如何让Yajra Datatable的created_at列按日期而非字符串排序
解决Yajra Datatable中created_at列排序不正确的问题
你的推测是对的:因为你将created_at格式化为d/m/Y的字符串,Datatables会按字符串字典序排序,而非日期时间顺序。以下是两种可行的修复方案:
方案一:使用data-order属性(客户端排序适用)
这种方法在显示格式化日期的同时,让Datatables使用原始时间戳进行排序:
修改日期列的格式化代码
在dataTable方法中,更新created_at和updated_at的editColumn闭包,返回包含data-order属性的HTML元素:->editColumn('created_at', function($data) { $formatedDate = Carbon::parse($data->created_at)->format('d/m/Y'); return '<span data-order="'.$data->created_at.'">'.$formatedDate.'</span>'; }) ->editColumn('updated_at', function($data) { $formatedDate = Carbon::parse($data->updated_at)->format('d/m/Y'); return '<span data-order="'.$data->updated_at.'">'.$formatedDate.'</span>'; })注:使用
Carbon::parse比指定固定格式更灵活,能自动识别Laravel模型中已转换为Carbon实例的时间字段。标记列为原始HTML
在Datatables构建链末尾添加rawColumns,确保HTML内容被正确渲染而非转义:->rawColumns(['created_at', 'updated_at', 'action'])
方案二:启用服务端排序(替代方案)
如果你的数据量较大,推荐启用服务端排序,此时排序会直接在数据库层面使用原始created_at字段进行:
- 修改
html()方法中的服务端设置
将serverSide(false)改为serverSide(true):->serverSide(true) - 确保
query()方法返回的Eloquent查询正确(你的当前代码已满足),Datatables会自动处理数据库层面的排序逻辑。
修改后的完整dataTable方法示例
public function dataTable($query) { return datatables() ->eloquent($query)->addIndexColumn() ->editColumn('created_at', function($data) { $formatedDate = Carbon::parse($data->created_at)->format('d/m/Y'); return '<span data-order="'.$data->created_at.'">'.$formatedDate.'</span>'; }) ->editColumn('updated_at', function($data) { $formatedDate = Carbon::parse($data->updated_at)->format('d/m/Y'); return '<span data-order="'.$data->updated_at.'">'.$formatedDate.'</span>'; }) ->editColumn('is_active', function ($item) { return $item->is_active == 1 ? 'AKTIF' : 'NON-AKTIF'; }) ->addColumn('action', function($item) { return ' <div class="btn-group"> <div class="dropdown"> <button class="btn btn-primary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Aksi </button> <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton"> <li> <a class="dropdown-item" href="'. route('user.edit', $item->id) .'"> Ubah </a> </li> <li> <a href="'. route('user.delete', $item->id) .'" class="dropdown-item text-danger" data-confirm-delete="true"> Delete </a> </li> </ul> </div> </div> '; }) ->rawColumns(['created_at', 'updated_at', 'action']); }
内容的提问来源于stack exchange,提问作者Lana Septiana
相关产品推荐
相关产品推荐

