21 octubre, 2024
Consultas avanzadas con tres tablas relacionadas
Consultas eloquent con tres modelos relacionados de uno a muchos en el Framework Laravel para extraer datos y mostrarlos usando Blade en una aplicación web

Suscríbete a nuestro canal en Youtube
SuscríbirseConsultas Avanzadas en Laravel con Tres Tablas o Modelos
Laravel es un potente framework de PHP que facilita la interacción con bases de datos a través de su ORM, Eloquent. En este artículo, exploraremos cómo realizar consultas avanzadas utilizando tres modelos relacionados: Usuarios, Publicaciones y Comentarios.
Escenario de Ejemplo: Estructura de la Base de Datos
Supongamos que estamos desarrollando una aplicación donde los usuarios pueden crear publicaciones, y cada publicación puede tener múltiples comentarios. La estructura de nuestras tablas es la siguiente:
-
users
- id
- name
- created_at
- updated_at
-
posts
- id
- user_id (referencia a la tabla users)
- title
- content
- created_at
- updated_at
-
comments
- id
- post_id (referencia a la tabla posts)
- user_id (referencia a la tabla users)
- content
- created_at
- updated_at
Paso 1: Definir las Relaciones en los Modelos
Antes de realizar consultas, debemos definir las relaciones entre nuestros modelos. Esto es fundamental para que Eloquent pueda entender cómo se relacionan las tablas.
Modelo User.php:
php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
public function posts() {
return $this->hasMany(Post::class); // Un usuario tiene muchas publicaciones
}
public function comments() {
return $this->hasMany(Comment::class); // Un usuario tiene muchos comentarios
}
}
Modelo Post.php:
php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model {
public function user() {
return $this->belongsTo(User::class); // Una publicación pertenece a un usuario
}
public function comments() {
return $this->hasMany(Comment::class); // Una publicación tiene muchos comentarios
}
}
Modelo Comment.php:
php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model {
public function post() {
return $this->belongsTo(Post::class); // Un comentario pertenece a una publicación
}
public function user() {
return $this->belongsTo(User::class); // Un comentario pertenece a un usuario
}
}
Con estas relaciones definidas, Eloquent puede navegar fácilmente entre usuarios, publicaciones y comentarios.
Paso 2: Realizar Consultas Avanzadas con Eager Loading
Ahora que tenemos nuestras relaciones definidas, podemos realizar consultas para obtener los datos que necesitamos. Queremos obtener todos los usuarios, sus publicaciones, y el comentario más reciente en cada publicación.
A continuación, se presentan varias consultas avanzadas en Laravel utilizando las tablas users, posts y comments. Estas consultas aprovechan las relaciones definidas en los modelos y las capacidades de Eloquent para obtener datos complejos de manera eficiente.
Obtener todos los usuarios y sus publicaciones con comentarios
Esta consulta carga todos los usuarios, sus publicaciones y los comentarios asociados a cada publicación.
$usersWithPostsAndComments = User::with(['posts.comments'])->get();
Obtener publicaciones de un usuario específico con sus comentarios más recientes
Si deseas obtener todas las publicaciones de un usuario específico junto con el comentario más reciente en cada publicación:
php
$userId = 1; // ID del usuario específico
$postsWithLatestComments = Post::where('user_id', $userId)
->with(['comments' => function($query) {
$query->latest(); // Obtener solo el comentario más reciente
}])
->get();
Contar la cantidad de publicaciones y comentarios por usuario
Para obtener la cantidad total de publicaciones y comentarios que ha realizado cada usuario:
$usersWithPostAndCommentCount = User::withCount(['posts', 'comments'])->get();
Esto generará dos campos adicionales en cada usuario: posts_count y comments_count.
Obtener usuarios que tienen al menos una publicación con al menos un comentario
Si deseas filtrar a los usuarios que tienen publicaciones que, a su vez, tienen comentarios:
php
$usersWithPostsAndComments = User::whereHas('posts.comments')->get();
Obtener el número total de comentarios por publicación
Si quieres obtener la cantidad total de comentarios en cada publicación:
php
Copiar código
$postsWithCommentCount = Post::withCount('comments')->get();
Esto añadirá un campo comments_count a cada publicación.
Obtener usuarios que no tienen publicaciones
Para encontrar usuarios que no tienen ninguna publicación registrada:
php
$usersWithoutPosts = User::doesntHave('posts')->get();
7. Obtener el comentario más reciente de cada publicación para todos los usuarios
Si deseas obtener cada publicación junto con su comentario más reciente:
php
Copiar código
$postsWithLatestComment = Post::with(['comments' => function($query) {
$query->latest()->take(1); // Tomar solo el último comentario
}])->get();
Obtener usuarios con sus publicaciones y, si están disponibles, sus comentarios
Esta consulta devolverá a los usuarios, sus publicaciones y los comentarios asociados, pero solo cargará comentarios si existen:
php
$usersWithPostsAndOptionalComments = User::with(['posts.comments'])->get();
Obtener los 5 usuarios más activos (que tienen más publicaciones)
Si quieres obtener los usuarios que tienen la mayor cantidad de publicaciones:
php
$topActiveUsers = User::withCount('posts')
->orderBy('posts_count', 'desc')
->take(5)
->get();
Obtener publicaciones de un usuario específico con comentarios filtrados por un usuario diferente
Si deseas obtener publicaciones de un usuario específico, pero solo mostrar comentarios de otro usuario:
php
$postUserId = 1; // ID del usuario de las publicaciones
$commentUserId = 2; // ID del usuario de los comentarios
$postsWithFilteredComments = Post::where('user_id', $postUserId)
->with(['comments' => function($query) use ($commentUserId) {
$query->where('user_id', $commentUserId);
}])
->get();
Leido 4983 veces | 1 usuarios
Código fuente no disponible.