Laravel Datatables search on nested Relationship
Because of using select()
here, you do not load the relationship. Also, use dot syntax for nested eager loading:
$videos = Video::with(['course_semester', 'course_semester.course'])
1- dataTable function
public function dataTable($query){ return datatables() ->eloquent($query) ->addColumn('BulkSelection', function ($category) { ->addColumn('company', function ($category) { return $category->company ? $category->company->name : 'No Company'; }) ->rawColumns(['action', 'company', 'createdAt','BulkSelection']);}
2- query function
public function query(Category $model){ return $model->with('company:id,name')->select('categories.*')->newQuery();}
3- getColumns function
$getCols = [ 'id', 'name', 'company'=> [ 'data'=>'company', 'name'=>'company.name' ], 'createdAt' => [ 'name'=>'created_at', 'searchable' => false ], 'action' => [ 'exportable' => false, 'searchable'=>false, 'orderable' => false ] ]; return $getCols;
If you just need to load the data from relation tables, use the below code
$videos = Video::with('course_semester','course', 'semester')->select('videos.*'); return Datatables::eloquent($videos) ->addColumn('check', function(Video $v){ return '<input type="checkbox" name="selected-videos" value="{{$v->id}}">' }) ->rawColumns(['check']) ->make(true);
And in script, you can call relation values as ,
{data: 'course_semester.id'}, {data: 'course.name'}, {data: 'semester.name'},