ManagementSystem/BACKEND/app/Traits/IsDatatableRequest.php

78 lines
2.3 KiB
PHP
Executable File

<?php
namespace App\Traits;
use Illuminate\Http\Request;
trait IsDatatableRequest
{
const DATATABLE_DATETIME = 'datetime';
const DATATABLE_STRING = 'string';
const DATATABLE_NUMBER = 'number';
const DATATABLE_OBJECT = 'object';
const DATATABLE_ARRAY = 'array';
const DATATABLE_CHILD = 'child';
const DATATABLE_STATUS = 'status';
const DATATABLE_ACTION = 'action';
const DATATABLE_CENTER = 'dt-head-center';
const DATATABLE_DETAIL_CONTROL = 'detail_control';
protected function _columns()
{
return [
[
'label' => 'Label',
'name' => 'column',
'type' => 'DATATABLE_...', // nullable
'orderable' => true, // nullable
'className' => 'dt-head-center', // nullable
'visible' => true
]
];
}
/**
* @return array
*/
public function paginateWithDatatable(&$builder, Request $request)
{
$columns = $this->_columns();
$perPage = $request->input('length');
$page = ((int) $request->input('start', 0) / (int) $request->input('length', 1)) + 1;
// order by
if ($request->get('order')) {
$orders = $request->get('order');
if (is_array($orders)) {
foreach ($orders as $index => $order) {
$indexCol = (int) $order['column']; // number
$dir = $order['dir']; // asc|desc
$builder = $builder->orderBy(
$columns[$indexCol]['name'], // get name by columns
$dir
);
}
}
}
$paginate = $builder->paginate(
perPage: $perPage,
page: $page
);
return [
"recordsTotal" => $paginate->total(),
"recordsFiltered" => $paginate->total(),
"payload" => $request->all(),
"data" => $paginate->getCollection()->map(function ($record) use ($columns) {
$data = collect($columns)
->values()
->map(function ($column) use ($record) {
return $record->{$column['name']};
});
return $data;
})->toArray()
];
}
}