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

Consultas avanzadas con tres tablas relacionadas

Suscríbete a nuestro canal en Youtube

Suscríbirse

Consultas 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
    • email
    • 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 4324 veces | 1 usuarios

Código fuente no disponible.

Compartir link del tutorial con tus amigos


Curso de Laravel básico

USD 0.00

Descarga del código fuente

Curso de Laravel básico
Laravel Página Web Administrable

USD 17.00

Descarga del código fuente

Laravel Página Web Administrable

Más tutoriales de Laravel

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú

© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2025