微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 数据表:如何使用第二个数据对列进行排序

如何解决Laravel 数据表:如何使用第二个数据对列进行排序

如何根据第二个数据排序?排序仅适用于 ID。但是在我的表中,我添加了徽章计数,这就是我想要的排序依据。

这是我的控制器

    return DataTables::of($users)
        ->addindexColumn()
        ->addColumn('Inventories',function ($row) {
            if($row->status != 'Dumped2') {
                return '<a href="'.route('admin.clients.show-client-inventories2',$row->id).'" class="btn btn-info btn-sm">'.__("Inventories").' <span class="right badge badge-success" title="Total Lost">'.(abs($row->inv_total_lost_qty) ?? 'N/A').'</span> </a>';
            }
        })
        ->addColumn('Returns',function ($row) {
            if($row->status != 'Dumped2') {
                return ' <a href="'.route('admin.clients.show-client-returns',$row->id) .'" class="btn btn-info btn-sm">'.__('Returns').' <span class="right badge badge-warning" title="Total Returns">'.(abs($row->overall_returns_count) ?? 'N/A').'</span> </a>';
            }
            $row->status->orderBy(abs($row->overall_returns_count));
        })
        ->addColumn('inbound_shipments',function ($row) {
            if($row->status != 'Dumped2') {
                return '<a href="'. route('admin.clients.show-client-inbound-shipments',$row->id).'" class="btn btn-info btn-sm">'. __('Inbound Shipments').'<span class="right badge badge-danger" title="Total Overcharged Fees">'. abs($row->shipment_quantity_diff).'</span> </a>';
            }
        })
        ->addColumn('overcharged',function ($row) {
            if($row->status != 'Dumped2') {
                return '<a href="'. route('admin.clients.show-client-overcharged-fee',$row->id).'" class="btn btn-info btn-sm">'.__('Overcharged Fee') .' <span class="right badge badge-primary" title="Total Overcharged Fees">'.(abs($row->overall_overcharged_fees_count) ?? 'N/A').'</span> </a>';
            }
        })
        ->addColumn('ALL',function ($row) {
            if($row->status != 'Dumped2') {
                $arr = array(abs($row->overall_overcharged_fees_count),abs($row->overall_returns_count),abs($row->inv_total_lost_qty),abs($row->shipment_quantity_diff));
                return array_sum($arr);
            }
        })
        ->addColumn('credentials',function ($row) {
            if($row->status != 'Dumped2') {
                return '<button onclick="set_credentials(this)" class="btn btn-danger btn-sm"> '.__("Set Credentials").'</button>';
            }
        })
        ->addColumn('reim',function ($row) {
            if($row->status != 'Dumped2') {
                return '<a href="'. route('admin.clients.show-client-reimbursements',$row->id).'" class="btn btn-danger btn-sm">'.__('Reimbursements') .'</a>';
            }
          
        })
        ->rawColumns(['Inventories','action','Returns','inbound_shipments','overcharged','ALL','credentials','reim'])
        ->make(true);
}

return view('admin.clients.index',compact('users'));

我要排序的列不是$row->id,我要的是第二个像abs($row->overall_returns_count)

在我的 Blade 代码中。我是这样写的:

//Update start
{width: "10%",data: 'ALL',name: 'ALL',orderable: true,searchable: false},{width: "10%",data: 'Inventories',name: 'Inventories',data: 'Returns',name: 'Returns',{width: "15%",data: 'inbound_shipments',name: 'Inbound Shipments',data: 'overcharged',name: 'Overchared Fee',

enter image description here

如您所见,如果我单击标题,它不会对徽章进行排序。相反,它对 id 进行排序,就像我悬停按钮时在左下角看到的那样。 (id 从 2 开始)

系统详情 操作系统 Windows 10

PHP 7.2 版

Laravel 6.0 版

Laravel-Datatables 版本 ^9.6

解决方法

你的数据来源是什么?如果您的数据源是 laravel 集合,您应该在使用 render: function (data,action,row) 初始化数据表时在 JavaScript 上呈现。应该是这样的:

{
    width: "10%",data: 'overall_returns_count',name: 'overall_returns_count',orderable: true,searchable: false,render: function (data,row) {
        if (row.status != 'Dumped2') {
            return ' <a href="/admin/client/' + row.id + '" class="btn btn-info btn-sm">' +
                'Returns <span class="right badge badge-warning" title="Total Returns">' + (Math.abs(data)) +
                '</span> </a>';
        }
    },},

如果您的数据源是查询构建器,您可以使用 PHP 进行渲染,但您应该使用 editColumn 而不是 addColumn。例子:

    ->editColumn('overall_returns_count',function ($row) {
        if($row->status != 'Dumped2') {
            return ' <a href="'.route('admin.clients.show-client-returns',$row->id) .'" class="btn btn-info btn-sm">'.__('Returns').' <span class="right badge badge-warning" title="Total Returns">'.(abs($row->overall_returns_count) ?? 'N/A').'</span> </a>';
        }
        $row->status->orderBy(abs($row->overall_returns_count));
    })

然后在 js 列中:

{width: "10%",searchable: false},

PHP 渲染仅在您使用 eloquent/DB 查询构建器作为数据源时有效,但 JS 渲染 适用于所有数据源,包括 Laravel Collection 和 eloquent builder。

仅供参考,Yajra Datatable 支持多种数据源,包括集合和查询生成器。有时如果你使用 Collection 作为数据源会导致性能变慢,并且某些功能看起来很混乱,所以我建议你使用 Query Builder 作为数据源。

这将返回集合:

$users = User::withCount('overall_returns')->get(); 

这将返回查询生成器:

$users = User::withCount('overall_returns'); 
,

尝试在行中添加数据顺序属性,如下所示

var model = require("./app/models/user.js");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。