Как отобразить данные с помощью отношения yajra datatable многие ко многим в laravel?

#laravel #yajra-datatable

#laravel #yajra-datatable

Вопрос:

Я использую Yajra datatable. Я хочу отображать данные и фильтровать данные по имени президента, у меня есть 3 таблицы

 1- Planes = id, title, description.

2- presidents = id, P_name.

3- Plane_president = plane_id , president_id
  

Плоская модель:

 public function president()
    {
        return $this->belongsToMany(President::class);
    }
  

Модель президента:

 public function planes()
{
    return $this->belongsToMany(Plane::class);
}
  

Мой контроллер :

 public function index(Request $request)
    {
    if ($request->ajax()) {
            $query = Plane::with('presidents')->selectRaw('distinct planes.*');
            return $this->dataTable
                ->eloquent($query)
                ->addColumn('P_name', function (Plane $plane) {
                    return $plane->presidents->map(function($president) {
                        return str_limit($president->P_name);
                    })->implode('amp;<bramp;>');
                })
                ->make(true);
        }

        return view('planes.index');
    }
  

js-код:

   <script type="text/javascript">
      $('#search').DataTable({
        processing: true,
        serverSide: true,
        ajax: '{{ route("plane.index") }}',
        columns: [
            {data: 'id', name: 'id'},
            {data: 'main_point', name: 'main_point'},
            {data: 'presidents[, ].P_name', name: 'president'},
        ]
    });
    </script>
  

У меня такая ошибка

 message "Undefined property: App\Http\Controllers\PlaneController::$dataTable"
  

Как устранить эту ошибку?

Ответ №1:

используйте DataTables:: для создания datatable , и вам не хватало ->rawColumns(['p_name']) , я добавил это

 if ($request->ajax()) {
    $plane = Plane::with('presidents')->selectRaw('distinct planes.*')->get();
    return DataTables::of($plane)
        ->addColumn('p_name', function ($plane) {
            return implode(', ', $plane->presidents->pluck('P_name')->toArray());
        })
        ->rawColumns(['p_name'])
        ->make(true);
}
  

в javascript

 <script type="text/javascript">
      $('#search').DataTable({
        processing: true,
        serverSide: true,
        ajax: '{{ route("plane.index") }}',
        columns: [
            {data: 'id', name: 'id'},
            {data: 'main_point', name: 'main_point'},
            {data: 'p_name', name: 'p_name'}, // manipulate data of this column in server side here just echo like this
        ]
    });
</script>
  

Ответ №2:

Вам нужно передать его, как показано ниже.

 return datatables()->eloquent($query);
  

Пожалуйста, проверьте документ. и для отображения имени президента я бы предложил.

 implode(', ', $plane->presidents->pluck('P_name')->toArray())
  

Комментарии:

1. У меня возникает эта ошибка, когда я хочу выполнить поиск в DataTables warning: table id=search - Exception Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'planes.presidents' in 'where clause' (SQL: select count(*) as aggregate from (select distinct planes.* from плоскостях данных, где (НИЖНИЙ ( planes . id ) НАПРИМЕР, %j% или НИЖЕ ( planes . main_point ) НАПРИМЕР, %j% или НИЖЕ ( planes . presidents ) КАК %j%)) count_row_table)`