Laravel Datatables按关系列排序不起作用

时间:2018-09-07 12:54:10

标签: php laravel-5 datatables eloquent yajra-datatable

我有一个User,可以分配给许多Company。我正在尝试使用Laravel Datatables和jQuery Datatables渲染表。它呈现得很好,并且在单击表标题中的订单图标时,它会按该列对数据进行排序,但不适用于关系列company_name。 这是我在控制器中的代码:

$users = User::with(['roles','companies'])
        ->where('users.id', '!=', Auth::id())
        ->whereHas('roles', function($q){$q->whereId(Role::ROLE_6);});

...

return Datatables::of($users)
->editColumn('company', function (User $user) {
                return $user->hasCompanies()? $user->companies->first()->company_name : trans('lang.company.not_assigned');
            })
->orderColumn('company', 'company')
->make(true);

这是我的数据表JavaScript

otable = $('#datatable_fixed').DataTable({
                "ajax": {
                    url: 'users/datatable',
                    type: 'POST',
                },
                "pageLength": 15,
                "processing": true,
                "stateSave": true,
                "serverSide": true,
                "bDestroy": true,
                columns: [
                    {data: 'first_name', name: 'first_name'},
                    {data: 'last_name', name: 'last_name'},
                    {data: 'company', name: 'company.company_name'},
                    {data: 'email', name: 'email'},
                    {data: 'status', name: 'status'},
                ],
                dom: 'Bfrtip',
                searching: false,
                "order": [[0, 'asc']],
                "autoWidth": true,
            });

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并且找到了解决该问题的好方法。我遇到的问题是,我需要一个包含两个可排序,可搜索的关系表列的串联值的列。因此,经过数小时的工作,我设法建立了一个可行的解决方案。因此,我将在这里分享它,以维护一个更好的社区。我将分享代码并附上简要的说明。

步骤01:

我有桌游,与司机,顾客,车辆和公司有多种关系。我想用驱动程序创建另一个串联的列。名称列+ drivers.code列,并带有drivers的别名。

下面的查询为我完成了上述工作。

$rides = Ride::select(['rides.*',DB::raw('CONCAT(drivers.code," - ",drivers.name) AS driver')])->with(['drivers','customers','vehicles','companies'])->join('drivers','rides.driver_id','=', 'drivers.id');

步骤02: 查询完之后,您的大部分工作都完成了。在此之后,我将以下代码添加到了这种加载数据表数据的ajax方法中,此代码将完成搜索和排序的工作。

var table = $('#myTable').DataTable({
                "processing":true,
                "serverSide":true,
                "ajax": "{{route('ajax.view.rides')}}",
                "columns": [
                   
                    {data: 'driver', name: 'driver', searchable:false},
                    {data: 'drivers.code', name:'drivers.code', searchable: true, sortable : true, visible:false},
                    {data: 'drivers.name', name:'drivers.name', searchable: true, sortable : true, visible:false},
                   
                ],
                responsive:true,
                order:[0,'desc']
            });

我们在查询中添加的连接列使排序成为可能

{data: 'driver', name: 'driver', searchable:false},

此代码将使两列的搜索成为可能

{data: 'drivers.code', name:'drivers.code', searchable: true, sortable : true, visible:false},
{data: 'drivers.name', name:'drivers.name', searchable: true, sortable : true, visible:false},

现在您需要在HTML表线程元素内添加两个额外的标签。

<thead>
  <tr>
    <th>Driver</th> <!-- this one will display the concatenated column -->
    <th>Driver</th> <!-- this one is for the hidden hidden column that enables the search on one column -->
    <th>Driver</th> <!-- this one is for the hidden hidden column that enables the search on one column -->
  </tr>
</thead>

就是这样,您现在可以很好地搜索和排序!祝您旅途愉快,美好的一天

答案 1 :(得分:0)

,

这对我有用:)