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

Laravel中orderBy DESC与ASC排序失效问题排查

问题

在Laravel项目中使用DataTables时,前端的升降序排序(orderBy DESC/ASC)无法正常工作。JS响应返回的数据已处于排序状态,相关示例数据及响应截图如下:

  • 示例数据截图
  • JS响应示例截图

以下是控制器查询代码及视图的DataTables配置代码,请问是否是控制器存在问题?

控制器查询代码

$query = Verifikasi_tte::join('surat_ttes', 'surat_ttes.id', '=', 'verifikasi_ttes.surat_tte_id')
                 ->join('users', 'users.id', '=', 'surat_ttes.user_id')
                 ->join('jenis_surat_ttes', 'jenis_surat_ttes.id', '=', 'surat_ttes.jenis_surat_tte_id')
                 ->select('surat_ttes.id','surat_ttes.klasifikasi','surat_ttes.no_surat','surat_ttes.tgl_surat','surat_ttes.created_at',
                 'jenis_surat_ttes.nama_jenis_surat','users.name','verifikasi_ttes.surat_tte_id','verifikasi_ttes.status')
                 ->orderBy('surat_ttes.id','DESC')->get();
          return Datatables::of($query)

视图的DataTables配置代码

<script type="text/javascript">
    $(function (e) {
            $('#data-table').DataTable({
            pageLength: 10,
            processing: true,
            serverSide: true,
            stateSave: true,
            ajax: "{{ url ('/verifikasi/data') }}",
            columns: [
                {data: 'name', name: 'name'},
                {data: 'nama_jenis_surat', name: 'nama_jenis_surat'},
                {data: 'no_surat', name: 'no_surat'},
                {data: 'dates', name: 'dates'},
                {data: 'status', name: 'status'},
                {data: 'action', name: 'action', orderable: false, searchable: false}
        ]
        });
    });
</script>

问题分析与解决方案

问题确实出在控制器代码上,核心原因有两点:

  1. 提前执行了数据库查询:你调用了->get()方法,这会直接把所有数据从数据库拉取为集合对象。而DataTables服务端模式(serverSide: true)需要接收查询构建器实例,才能接管排序、分页、搜索等服务端操作。用get()后,DataTables无法再修改查询逻辑,前端排序会被你提前设置的orderBy固定,导致点击排序无效。
  2. 字段映射不匹配:前端配置的dates字段,在控制器的select语句中没有对应项(你查询的是tgl_surat和created_at),这会导致该列排序时服务端找不到对应数据库字段,引发异常。

修正后的控制器代码

$query = Verifikasi_tte::join('surat_ttes', 'surat_ttes.id', '=', 'verifikasi_ttes.surat_tte_id')
                 ->join('users', 'users.id', '=', 'surat_ttes.user_id')
                 ->join('jenis_surat_ttes', 'jenis_surat_ttes.id', '=', 'surat_ttes.jenis_surat_tte_id')
                 ->select(
                     'surat_ttes.id',
                     'surat_ttes.klasifikasi',
                     'surat_ttes.no_surat',
                     'surat_ttes.tgl_surat as dates', // 将tgl_surat重命名为dates,匹配前端字段
                     'surat_ttes.created_at',
                     'jenis_surat_ttes.nama_jenis_surat',
                     'users.name',
                     'verifikasi_ttes.surat_tte_id',
                     'verifikasi_ttes.status'
                 )
                 ->orderBy('surat_ttes.id','DESC'); // 移除get(),保留查询构建器
          return Datatables::of($query)->make(true); // 添加make(true)返回标准JSON响应

关键修改说明

  • 移除->get():让$query保持为查询构建器对象,确保DataTables能对查询进行动态修改。
  • 字段重命名:将tgl_surat改为dates,和前端配置的data: 'dates'对应,保证该列排序能关联到正确的数据库字段。
  • 添加->make(true):生成符合DataTables要求的JSON响应格式,这是Laravel DataTables包的标准用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:35:26