es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo ejecutar una consulta anidada en Laravel.

Tengo las siguientes 3 tablas:

Classrooms

id subject

RegisteredStudents

id user_id class_id

Posts

id class_id type attachment

Models

Classroom.php


public function posts()
{
return $this->hasMany(Post::class);
}

RegisteredStudents.php


public function classroom()
{
return $this->belongsTo(Classroom::class);
}

Post.php


public function classroom()
{
return $this->belongsTo(Classroom::class);
}

Ahora necesito obtener todas las publicaciones de una clase en particular, en la que un estudiante está registrado.

Por ejemplo, un estudiante está registrado para la clase cuyo id es 1 en la tabla de aulas. Por lo tanto, se registrará en la tabla registered_students que este usuario en particular está registrado en esta clase en particular. Cada clase puede tener varias publicaciones en la tabla de publicaciones. Y el usuario debe obtener todas las publicaciones de su clase.

Estoy intentando algo como esto:


$registered_classes = RegisteredStudent::where('user_id', $user->id)
->where(function ($q) use ($class_id){
Post::where('class_id', $class_id);
})->get();

que definitivamente no es correcto. ¿Cuál sería la consulta correcta para esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener todas las publicaciones de una clase en la que un estudiante está registrado, puedes usar la siguiente consulta:

    $registered_classes = RegisteredStudent::where('user_id', $user->id)
        ->with(['classroom.posts' => function ($query) use ($class_id) {
            // Filtrar las publicaciones por el class_id dado
            $query->where('class_id', $class_id);
        }])
        ->get();
    
    // Obtener todas las publicaciones de la clase registrada
    $posts = $registered_classes->pluck('classroom.posts')->flatten();
    

    Explicación:

    1. Primero, obtenemos el/los objeto(s) RegisteredStudent donde el user_id coincide con el id de usuario dado.
    2. Luego, usamos el método with() para cargar de forma ambiciosa la relación posts para el classroom de cada RegisteredStudent.
    3. En el método with(), pasamos un cierre que define una consulta para filtrar las publicaciones por el class_id dado.
    4. Finalmente, usamos los métodos pluck() y flatten() en la colección classroom.posts para obtener todas las publicaciones de la clase registrada.

Comments are closed.