Kritim Yantra
Apr 07, 2025
When working with relational data in Laravel DataTables, you often need to:
This guide covers everything from basic relationship handling to advanced filtering techniques.
1. Setting Up Relationships in DataTables
users
id - integer
name - string
email - string
department_id - integer
departments
id - integer
name - string
// User.php
public function department()
{
return $this->belongsTo(Department::class);
}
public function getUsers()
{
$model = User::with('department');
return DataTables::eloquent($model)
->addColumn('department_name', function(User $user) {
return $user->department->name;
})
->toJson();
}
<!-- Add above your table -->
<div class="row mb-3">
<div class="col-md-3">
<select class="form-control filter-select" data-column="3">
<option value="">All Departments</option>
@foreach($departments as $department)
<option value="{{ $department->name }}">{{ $department->name }}</option>
@endforeach
</select>
</div>
</div>
let table = $('#users-table').DataTable({
// ... standard config
});
$('.filter-select').on('change', function() {
let column = $(this).data('column');
table.column(column).search(this.value).draw();
});
return DataTables::eloquent($model)
->filter(function ($query) {
if (request()->has('department_filter')) {
$query->whereHas('department', function($q) {
$q->where('name', request('department_filter'));
});
}
});
// In controller index method
$departments = Department::pluck('name', 'id');
return view('users.index', compact('departments'));
<form id="filter-form">
<select name="department_id" class="form-control">
<option value="">All Departments</option>
@foreach($departments as $id => $name)
<option value="{{ $id }}">{{ $name }}</option>
@endforeach
</select>
<button type="submit" class="btn btn-primary">Filter</button>
</form>
$('#filter-form').on('submit', function(e) {
e.preventDefault();
table.ajax.url("{{ route('users.data') }}?" + $(this).serialize()).load();
});
// Filter users by their roles
->filter(function ($query) {
if (request()->has('role')) {
$query->whereHas('roles', function($q) {
$q->where('name', request('role'));
});
}
})
// Filter comments by commentable type
->filter(function ($query) {
if (request()->has('commentable_type')) {
$query->where('commentable_type', request('commentable_type'));
}
})
return DataTables::eloquent($model)
->select(['users.id', 'users.name', 'departments.name as department_name'])
->join('departments', 'users.department_id', '=', 'departments.id')
columns: [
{ data: 'id', searchable: false },
{ data: 'name' },
{ data: 'department_name', searchable: true }
]
$departments = Cache::remember('departments.filter', 3600, function() {
return Department::all();
});
public function getUsers()
{
$model = User::with('department', 'roles')
->select(['users.*']);
return DataTables::eloquent($model)
->addColumn('department_name', function(User $user) {
return $user->department->name;
})
->addColumn('roles', function(User $user) {
return $user->roles->pluck('name')->implode(', ');
})
->filter(function ($query) {
// Department filter
if (request()->has('department_id')) {
$query->where('department_id', request('department_id'));
}
// Role filter
if (request()->has('role')) {
$query->whereHas('roles', function($q) {
$q->where('name', request('role'));
});
}
// Date range filter
if (request()->has('date_from')) {
$query->whereDate('created_at', '>=', request('date_from'));
}
})
->toJson();
}
<table id="users-table" class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
<th>Department</th>
<th>Roles</th>
<th>Joined At</th>
</tr>
</thead>
</table>
<script>
$(document).ready(function() {
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: {
url: "{{ route('users.data') }}",
data: function(d) {
d.department_id = $('#department-filter').val();
d.role = $('#role-filter').val();
}
},
columns: [
{ data: 'id' },
{ data: 'name' },
{ data: 'email' },
{ data: 'department_name' },
{ data: 'roles' },
{
data: 'created_at',
render: function(data) {
return new Date(data).toLocaleDateString();
}
}
]
});
// Refresh table when filters change
$('.filter').on('change', function() {
$('#users-table').DataTable().ajax.reload();
});
});
</script>
You've now learned how to:
✅ Display relational data in DataTables
✅ Implement column-specific filtering
✅ Handle complex relationship queries
✅ Optimize server-side performance
📌 Need help? Drop your questions below! 👇
No comments yet. Be the first to comment!
Please log in to post a comment:
Sign in with Google