INNER JOIN usando Yajra Datatables en Laravel

INNER JOIN usando Yajra Datatables en Laravel. En Laravel, cuando utilizas el paquete Yajra Datatables para manejar tablas dinámicas, puedes realizar un INNER JOIN entre tablas directamente en la consulta que alimenta la DataTable. A continuación te explico cómo hacerlo en español:
INNER JOIN usando Yajra Datatables en Laravel
A continuación, veremos 4 pasos para implementar INNER JOIN en Laravel con el paquete Yajra Datatables.
Paso 1: Instalar Yajra Datatables
Si no lo has hecho, instala el paquete Yajra Datatables en tu proyecto Laravel:
composer require yajra/laravel-datatables-oracle
Luego, publica los archivos de configuración:
php artisan vendor:publish --provider="Yajra\DataTables\DataTablesServiceProvider"
Paso 2: Configurar el Controlador
Supongamos que tienes dos tablas: users
y posts
, y quieres hacer un INNER JOIN para obtener los datos de ambas tablas.
- En tu controlador, define la consulta con el INNER JOIN.
- Usa el método
datatables()
de Yajra para convertir la consulta en una DataTable.
Ejemplo de uso:
<?php
use App\Models\User;
use DataTables;
class UserController extends Controller
{
public function index()
{
return view('users.index');
}
public function getUsers()
{
// Consulta con INNER JOIN
$users = User::join('posts', 'users.id', '=', 'posts.user_id')
->select([
'users.id',
'users.name',
'users.email',
'posts.title as post_title',
'posts.created_at as post_created_at'
]);
return DataTables::of($users)->make(true);
}
}
Paso 3: Configurar la Vista
En tu vista (por ejemplo, resources/views/users/index.blade.php
), incluye la DataTable y configura las columnas.
<!DOCTYPE html>
<html>
<head>
<title>Usuarios y Posts</title>
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css">
</head>
<body>
<table id="users-table" class="display" style="width:100%">
<thead>
<tr>
<th>ID</th>
<th>Nombre</th>
<th>Email</th>
<th>Título del Post</th>
<th>Fecha del Post</th>
</tr>
</thead>
</table>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
<script>
$(document).ready(function() {
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: '{{ route("users.data") }}',
columns: [
{ data: 'id', name: 'users.id' },
{ data: 'name', name: 'users.name' },
{ data: 'email', name: 'users.email' },
{ data: 'post_title', name: 'posts.title' },
{ data: 'post_created_at', name: 'posts.created_at' }
]
});
});
</script>
</body>
</html>
Paso 4: Configurar las Rutas
En tu archivo routes/web.php
, define las rutas para el controlador:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/data', [UserController::class, 'getUsers'])->name('users.data');
Explicación de integracion de Inner Join en Laravel:
- Consulta con INNER JOIN: En el controlador, usas
join()
para unir las tablasusers
yposts
mediante la claveuser_id
. - DataTable: Conviertes la consulta en una DataTable usando
DataTables::of()
. - Vista: Configuras la tabla HTML y usas JavaScript para inicializar DataTables.
- Rutas: Defines las rutas para acceder a la vista y obtener los datos.
Resultado en el navegador:
Al cargar la página o proyecto, verás una tabla dinámica con los datos de los usuarios y sus posts, obtenidos mediante un INNER JOIN.
Segundo Ejemplo: Inner Join usando 2 tablas (Usuarios y Post)
Para unir 2 tablas en Yajra DataTables dentro de un proyecto de Laravel, puedes usar relaciones Eloquent o los métodos de Query Builder. A continuación un ejemplo de cómo se puede utilizar el Query Builder para unirse a las tablas y mostrar los datos utilizando Yajra DataTables.
Vamos a suponer que tenemos dos Tablas,
users
yposts
, dóndeposts
tiene una clave foráneauser_id
referenciasusers.id
, puede unirse a estas tablas y seleccionar las columnas que necesita para mostrar en su DataTable.
He aquí un ejemplo de cómo podrías configurar esto en un método de controlador:
<?php
use App\Models\User;
use Yajra\DataTables\DataTables;
public function getUsersWithPosts()
{
// Usamos query builder para unir tablas
$query = User::query()
->join('posts', 'users.id', '=', 'posts.user_id')
->select([
'users.id',
'users.name',
'posts.title',
'posts.body'
]);
return DataTables::of($query)
->make(true);
}
Espero que esta explicación ayude a despejar dudas sobre la implementación de unión de tablas en Laravel.