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>
问题分析与解决方案
问题确实出在控制器代码上,核心原因有两点:
- 提前执行了数据库查询:你调用了
->get()方法,这会直接把所有数据从数据库拉取为集合对象。而DataTables服务端模式(serverSide: true)需要接收查询构建器实例,才能接管排序、分页、搜索等服务端操作。用get()后,DataTables无法再修改查询逻辑,前端排序会被你提前设置的orderBy固定,导致点击排序无效。 - 字段映射不匹配:前端配置的
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
相关产品推荐
相关产品推荐

