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! 👇
Transform from beginner to Laravel expert with our personalized Coaching Class starting June 21, 2025. Limited enrollment ensures focused attention.
1-hour personalized coaching
Build portfolio applications
Industry-standard techniques
Interview prep & job guidance
Complete your application to secure your spot
Thank you for your interest in our Laravel mentorship program. We'll contact you within 24 hours with next steps.
No comments yet. Be the first to comment!
Please log in to post a comment:
Sign in with Google