Я изо всех сил пытаюсь выполнить сортировку и поиск для работы с столбцами отношений в Laravel / Yajra Datatables .
У меня есть модель Metro
, которая связана с Station
. Вот мой код.
столбцы таблицы метро
id, name, number, origin_id, destination_id, created_at, updated_at
столбцы таблицы станций
id, name, code, info, photo, created_at, updated_at
Модель Metro
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function origin()
{
return $this->belongsTo(Station::class, 'origin_id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function destination()
{
return $this->belongsTo(Station::class, 'destination_id');
}
MetroController JSON
/**
* DataTable json data request
*
* @param \App\Metro $metro
*
* @return mixed
* @throws \Exception
*/
public function jsonData(Metro $metro)
{
return DataTables::of($metro::select('id', 'name', 'number', 'origin_id', 'destination_id', 'created_at', 'updated_at'))
->addColumn('action', function ($metro) {
$show = route('admin.metros.show', $metro);
$edit = route('admin.metros.edit', $metro);
$destroy = route('admin.metros.destroy', $metro);
$attr = 'onclick=metroDelete(' . $metro->id . ')';
return view('admin.components.action', compact([
'show',
'edit',
'destroy',
'attr',
]));
})
->editColumn('origin_id', function ($metro) {
return '<a href="'.route('admin.stations.show', $metro->origin->id).'">' . $metro->origin->name . '</a>';
})
->editColumn('destination_id', function ($metro) {
return '<a href="'.route('admin.stations.show', $metro->destination->id).'">' . $metro->destination->name . '</a>';
})
->editColumn('created_at', function ($metro) {
return $metro->created_at->diffForHumans();
})
->escapeColumns([])
->make(TRUE);
}
Просмотр - Javascript
$(document).ready(function () {
let metroDataTable = $('#metroDataTable');
metroDataTable.DataTable({
serverSide : true,
processing : true,
autoWidth : false,
ajax : '{!! route('admin.metros.json') !!}',
lengthMenu : [[25, 50, 75, 100, -1], [25, 50, 75, 100, "All"]],
columns : [
{data: 'id', name: '{{__('admin.metro.id')}}', width: '50px'},
{data: 'name', name: '{{__('admin.metro.name')}}', width: '100px'},
{data: 'number', name: '{{__('admin.metro.number')}}', width: '100px'},
{data: 'origin_id', name: '{{__('admin.metro.origin')}}', width: '200px'},
{data: 'destination_id', name: '{{__('admin.metro.destination')}}', width: '200px'},
{data: 'created_at', name: 'created_at'},
{
data : 'action',
name : '{{__('admin.action')}}',
orderable : false,
searchable: false,
className : 'text-center'
},
],
initComplete: function () {
this.api().columns().every(function () {
var column = this;
var input = document.createElement("input");
$(input).appendTo($(column.footer()).empty())
.on('change', function () {
column.search($(this).val(), false, false, true).draw();
});
});
}
}); // end of DataTables
}); // end of jQuery Document
Когда я пытаюсь отсортировать столбец Origin
или Destination
или искать столбец, появляется следующая ошибка.
Вопрос:
Как сделать столбцы 'origin and
destination' с возможностью сортировки и поиска?