Я изо всех сил пытаюсь выполнить сортировку и поиск для работы в столбцах отношений в 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
Модель Метро
/**
* @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');
}
Метроконтроллер 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 доступными для сортировки и поиска?
name
в опции dataTablescolumns
? Он используется только API-интерфейсом dataTable, поэтому его не нужно переводить. Попробуйте изменитьname: '{{__('admin.metro.origin_id')}}'
наname: 'origin_id'
. - person Remul   schedule 17.06.2020metros
. - person Code Lover   schedule 17.06.2020$metro::with('origin')
, а затем вы можете изменить имя наname: 'origin.name'
- person Remul   schedule 17.06.2020map
.return $user->posts->map(function($post) ...
. Давая мне что-то вроде ошибки, не обнаруженной функцией. Так что мне нужно написатьmap
функцию где-нибудь в моем контроллере? Извините, если это глупый вопрос. - person Code Lover   schedule 17.06.2020