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

如何让Yajra Datatable的created_at列按日期而非字符串排序

解决Yajra Datatable中created_at列排序不正确的问题

你的推测是对的:因为你将created_at格式化为d/m/Y的字符串,Datatables会按字符串字典序排序,而非日期时间顺序。以下是两种可行的修复方案:

方案一:使用data-order属性(客户端排序适用)

这种方法在显示格式化日期的同时,让Datatables使用原始时间戳进行排序:

  1. 修改日期列的格式化代码
    在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实例的时间字段。

  2. 标记列为原始HTML
    在Datatables构建链末尾添加rawColumns,确保HTML内容被正确渲染而非转义:

    ->rawColumns(['created_at', 'updated_at', 'action'])
    

方案二:启用服务端排序(替代方案)

如果你的数据量较大,推荐启用服务端排序,此时排序会直接在数据库层面使用原始created_at字段进行:

  1. 修改html()方法中的服务端设置
    将serverSide(false)改为serverSide(true):
    ->serverSide(true)
    
  2. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:20:00