Laravel + Datatables, как передать идентификатор контроллеру?

Я хочу начать использовать Datatables в моем проекте Laravel, поэтому я последовал этому руководству: https://youtu.be/ejj-078OvfY

Он работает хорошо, но я не могу понять, как передать параметр моему контроллеру, поскольку этот маршрут вызывается вызовом AJAX через функцию JavaScript в представлении.

Это может показаться немного странным, если вы не знакомы с учебником, поэтому позвольте мне показать вам, как это настроить:

ROUTE:

Route::get('/client/{id}', array('before' => 'auth', 'as' => 'getClient', 'uses' => 'ClientsController@getClient'));
Route::get('getAllParticipants', array('before' => 'auth', 'as' => 'getAllParticipants', 'uses' => 'ClientsController@showAllParticipants'));

ДИСПЕТЧЕР:

public function getClient() {
 return View::make('/forms/dashboard_clients');
 }
 public function showAllParticipants () {
 $allParticipants = User::where('users.id', '=', $id) //I need the ID parameter here
 ->join('users_roles', 'users.id', '=', 'users_roles.user_id')
 ->where('users_roles.role_id', '!=', Role::USER_PARTICIPANT)
 ->groupBy('users.id')
 ->get();

 return Datatable::collection($allParticipants)
 ->searchColumns('firstname', 'lastname', 'email')
 ->orderColumns('firstname', 'lastname', 'email')
 ->addColumn('firstname', function ($model) {
 return $model->firstname;
 })
 ->addColumn('lastname', function ($model) {
 return $model->lastname;
 })
 ->addColumn('email', function ($model) {
 return $model->email;
 })
 ->make();
 }

ПОСМОТРЕТЬ:

<div> 
 <div>
 <table id="allParticipants">
 <thead>
 <tr>
 <th scope="col">@lang('table.headers.fname')</th>
 <th scope="col">@lang('table.headers.lname')</th>
 <th scope="col">@lang('table.headers.email')</th>
 <th scope="col">@lang('table.headers.action')</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 
 
 
 </tr>
 </tbody>
 </table>
 </div>
</div>

Итак, чтобы подвести итог, пользователь приземляется на маршрут /client/{id}, где будет отображаться представление. С этой точки зрения JavaScript идентифицирует таблицу по ее идентификатору и отправляет вызов Ajax, который запускает маршрут getAllParticipants, где коллекция участников отправляется в представление.

Любая идея о том, как я могу указать параметр ID для этой функции showAllParticipants на моем контроллере?

1 ответ

Из того, что я вижу, вы хотите установить параметр ID на маршруте, достаточно простой, вопрос в том, как Datatables делает этот запрос AJAX, отправляет ли он идентификатор, когда он вызывает вызов getAllParticipants?

Если это можно сделать двумя способами: либо установить идентификатор на этом маршруте, как и для маршрута клиента. Или вы используете традиционный параметр GET и извлекаете его, вызывая $request-> input ('paramname') в вашем контроллере.

Меня смущает то, что ваш Datatable не отправляет какие-либо данные, которые он просто вызывает маршрут контроллера, не отправляя никаких данных. Чтобы отправить данные, я должен поверить, что это выглядит так

$('#example').dataTable( {
 "ajax": {
 "url": "/getAllParticipants",
 "data": {
 "id": 451
 }
 }
} );

или альтернативно

$('#example').dataTable( {
 "ajax": {
 "url": "/getAllParticipants?id=" + 451
 }
} );

Таким образом, в моем контроллере я бы ввел класс Request и получил "id" от этого

public function showAllParticipants (Request $request) {
 $id = $request->input('id');

 $allParticipants = User::where('users.id', '=', $id) //I need the ID parameter here
 ->join('users_roles', 'users.id', '=', 'users_roles.user_id')
 ->where('users_roles.role_id', '!=', Role::USER_PARTICIPANT)
 ->groupBy('users.id')
 ->get();

 return Datatable::collection($allParticipants)
 ->searchColumns('firstname', 'lastname', 'email')
 ->orderColumns('firstname', 'lastname', 'email')
 ->addColumn('firstname', function ($model) {
 return $model->firstname;
 })
 ->addColumn('lastname', function ($model) {
 return $model->lastname;
 })
 ->addColumn('email', function ($model) {
 return $model->email;
 })
 ->make();
 }

licensed under cc by-sa 3.0 with attribution.