Laravel Datatables无法按关联列排序

6

我有一个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);

以下是我的datatables的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个回答

7
我有一个名为rides的表,其中涉及多个与driverscustomersvehiclescompanies相关的关系。我需要一列包含两个关系表列的连接值,并且可以进行排序和搜索。
这个查询可以为我完成以上工作。
$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');

在此之后,我添加了下面的代码到加载数据表数据的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表格线程元素内添加两个额外的<th>标签。
<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>

0

这对我有效

$model = Expenses::with('employee')
    ->where('bookingoffice_id', Auth::user()->bookingoffice)
    ->where('capitalsmb.expenses.active', 1)
    ->select('expenses.*');

我遇到了一个问题,添加->select('expenses.*')也会导致N+1问题,这将导致相同的数据多次显示,这个问题在这个评论中也提到了,https://github.com/yajra/laravel-datatables/issues/2623#issuecomment-827327299 - CodingEra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接