Multiple ordering in Laravel Yajra datables

Viewed 19

I can't figure out how to implement several rules of ordering in my Yajra Datatable.

I have table of rides history and there I have a status column which has several enum values (completed, cancelled, scheduled, started). I need to implement following rules for my datatable.

  • if status =SCHEDULED, display them on top of the list, sorted by schedule_at asc
  • if status != SCHEDULED or CANCELLED (so normal active/completed ride) - display based on assigned_at column
  • if status = CANCELLED & assigned_at is not null - display based on assigned_at
  • if status = CANCELLED & assigned_at is null - display based on updated_at

in this method I load my requests

    public function getRequests(Request $request){
    $data = UserRequests::RequestHistory();
    if ($request->ajax()) {
        return Datatables::of($data)
            ->addColumn('options', function ($data) {
                return (string) view('admin.request.optionsRequest', ['request' => $data]);
            })
            ->rawColumns(['options'])
            ->make(true);
    }}

database query

    public function scopeRequestHistory($query){
    return $query->orderBy('user_requests.created_at', 'desc')
        ->with('user','payment','provider', 'scheduled_assigned_provider');}

here is datatable on frontend

$('#table-request').DataTable({
        processing: true,
        serverSide: true,
        ajax: "{{ route('requests.list') }}",
        columns: [
            {data: 'id', name: 'id',"searchable": false },
            {data: 'booking_id', name: 'booking_id'},
            {data: 'user_id', name: 'user_id'},
            {data: 'provider_id', name: 'provider_id'},
            {data: 'user.first_name',name: 'user.first_name'},
            {data: 'user.last_name',name: 'user.last_name'},
            {data: 'provider.first_name',name: 'provider.first_name'},
            {data: 'provider.last_name',name: 'provider.last_name'},
            {data: 'assigned_at', name: 'assigned_at', render: function(d) {
                    return moment(d).format("DD.MM.YYYY HH:mm:ss");
                }
            },
            {data: 'schedule_at', name: 'schedule_at', render: function(d) {
                if (moment(d).format("DD.MM.YYYY HH:mm:ss")=='Invalid date')
                    return '--';
                else
                    return moment(d).format("DD.MM.YYYY HH:mm:ss");
                }
            },
            {data: 'status', name: 'status', "searchable": false },
            {data: 'is_scheduled', name: 'is_scheduled', "searchable": false },
            {data: 'payment.total', name: 'payment.total', "searchable": false, render: function ( data, type, row ) {

                if(data===undefined)
                {
                    return 'N/A';
                }
                else
                    return '€' + data;}},
            {data: 'payment_mode', "searchable": false },
            {data: 'paid', name: 'paid', render: function ( data, type, row ) {

                    if(data===undefined)
                    {
                        return 'Paid';
                    }
                    else
                        return 'Not Paid';}},
            {data: 'options'},
        ],
        searchCols: [
            null,
            null,
            { "search": $.urlParamUser('search'),"regex": true },
            { "search": $.urlParamProvider('search'),"regex": true },
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
        ],
        "aaSorting": [0,'desc'],
        "columnDefs": [{
            "targets": '_all',
            "defaultContent": "N/A"
        }],
    });
0 Answers
Related