Laravel 的 DataTables 库 可以在与前端简单交互,快速构建后台列表页面,包括所有字段的查询、排序等功能。

这边因为刚接触这个 DataTables 库,只知道简单的格式化使用,在遇见需要查询关联表的字段时遇到了困难。

正常的调用(摘自 github readme 示例):return datatables()->of(User::query())->toJson();,现有代码里的写法(yajra/laravel-datatables-oracle:~6.0):return Datatables::of($data)->add[edit]Column('xx', function(){})->make(true);,这种写法可以查询、筛选之后对结果集进行增加或修改字段,分页处理,并返回 json 格式数据。

使用中发现,列表页中的字段对应是否可以搜索,以及匹配的表中字段在前端初始化参数中的 columns 中的 searchable 和 name 定义的。

$('#users-table').DataTable({
    processing: true,
    serverSide: true,
    stateSave: true,
    ajax: {
        url: '{{ route("path.to.getData") }}',
        type: 'post',
        data: {status: 0, trashed: false}
    },
    columns: [
        {data: 'id', name: 'id', searchable:true},
        {data: 'name', name: 'name'},
        ...
    ],
    order: [[0, "asc"]],
    searchDelay: 500
});

searchable 默认为 true,表示可以搜索,后台会使用 name 字段定义作为查询字段,匹配提交的 $request->input('search.value'); 参数(或者取对应索引的 columns[i][name]columns[i][search][value])。

如果查询关联表字段,当 Datatables::of($data) 中的 $data 为 query 对象时,需要使用表名.字段 形式,比如 shops.name,使用 select() 别称无效且报错找不到字段;当 $data 为查询结果集 collection(增加 get())时,可以使用 select() 选择的别称字段名作为 name 使用。