Laravel yajra Datatable: как отправить параметры в класс обслуживания DataTable для пользовательского запроса?

Как мне передать параметры вроде ( res_id, resname и т. д.) DataTable Service Class (RestaurantDataTable) для пользовательских запросов к базе данных, как (получить только ресторан, где id = x, или же resname = xxx так далее)?

RestaurantController:

use App\DataTables\restaurantDataTable;

class restaurantController extends AppBaseController
{
public function index(restaurantDataTable $restaurantDataTable)
{

return $restaurantDataTable->render('restaurant.index');

}
}

restaurantDataTable:

class restaurantDataTable extends DataTable
{

/**
* @return \Illuminate\Http\JsonResponse
*/
public function ajax()
{

return $this->datatables
->eloquent($this->query())
->addColumn('action', 'restaurant.datatables_actions')
->make(true);
}

/**
* Get the query object to be processed by datatables.
*
* @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder
*/
public function query()
{

$restaurants = restaurant::query();

return $this->applyScopes($restaurants);}

/**
* Optional method if you want to use html builder.
*
* @return \Yajra\Datatables\Html\Builder
*/
public function html()
{
return $this->builder()
->columns($this->getColumns())
->addAction(['width' => '10%'])
->ajax('')
->parameters([
'dom' => 'Blfrtip',
'scrollX' => false,
'buttons' => [
'print',
'reset',
'reload',
[
'extend'  => 'collection',
'text'    => '<i class="fa fa-download"></i> Export',
'buttons' => [
'csv',
'excel',
'pdf',
],
],
'colvis'
]
]);
}

/**
* Get columns.
*
* @return array
*/
private function getColumns()
{
return [
'res_name' => ['name' => 'res_name', 'data' => 'res_name'],
'res_address' => ['name' => 'res_address', 'data' => 'res_address'],
'res_state' => ['name' => 'res_state', 'data' => 'res_state'],
'res_location' => ['name' => 'res_location', 'data' => 'res_location'],
'res_area' => ['name' => 'res_area', 'data' => 'res_area']
];
}

/**
* Get filename for export.
*
* @return string
*/
protected function filename()
{
return 'restaurant';
}
}

Table.blade.php:

@section('css')
@include('layouts.datatables_css')
@endsection

{!! $dataTable->table(['width' => '100%']) !!}@section('scripts')
@include('layouts.datatables_js')
{!! $dataTable->scripts() !!}
@endsection

Нужно ли настраивать функции в UsersDataTable Класс как public function custom_query($param) {} или же public function custom_ajax($param) {}?

1

Решение

Передайте параметры в вашу функцию index @ restaurantController (всегда так и делаете), и объект с данными будет их перехватывать. Вы можете проверить, были ли отправлены параметры:

public function index(restaurantDataTable $restaurantDataTable)
{
dd($restaurantDataTable->->request()->all());
return $restaurantDataTable->render('restaurant.index');

}

После отправки параметров отредактируйте функцию html () в restaurantDataTable следующим образом:

public function html()
{
$url = 'yourUrl';
if ($this->request()->has("res_id")) {
$url = $url."?resId=".$this->request()->get("res_id");
}

return $this->builder()
->columns($this->getColumns())
->addAction(['width' => '10%'])
->ajax($url)
->parameters([
'dom' => 'Blfrtip',
'scrollX' => false,
'buttons' => [
'print',
'reset',
'reload',
[
'extend'  => 'collection',
'text'    => '<i class="fa fa-download"></i> Export',
'buttons' => [
'csv',
'excel',
'pdf',
],
],
'colvis'
]
]);
}

Теперь datatable отправит параметры. После этого вы можете отфильтровать запрос следующим образом:

public function ajax()
{
return $this->datatables
->eloquent($this->query())
->addColumn('action', 'restaurant.datatables_actions')
->filter(function ($query) {
if ($this->request()->has("resId")) {
$query->where("res_id", $this->request()->get("resId"));
}
})
->make(true);
}

Я знаю, что это не лучшее решение, но пока работает. Я надеюсь, что это полезно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]