Laravel Datatables search on nested Relationship Laravel Datatables search on nested Relationship laravel laravel

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'},