78 lines
2.3 KiB
PHP
Executable File
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()
|
|
];
|
|
}
|
|
}
|