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"
}],
});