Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

319
Vistas
¿Cuál es la mejor manera de obtener una fila a través de una tabla en Laravel?

Tengo las siguientes tablas en mi base de datos:
relación de base de datos

Me gustaría enumerar los videos con la mejor calificación de comentarios, así:
Listar el contenido de la base de datos

aplicación/Ayudantes/función.php

 function best_comment($data, $value = 'name') { $properties = array(); foreach($data->episodes as $episode) { if(! isset($properties['id']) || $properties['id'] > $season->bestComment[0]->id) { $properties['id'] = $season->bestComment[0]->id; $properties['name'] = $season->bestComment[0]->name; } } if(! empty($properties)) { return $properties[$value]; } }

aplicación/Video.php

 public function episodes() { return $this->hasMany(Episode::class); }

aplicación/Episodio.php

 public function bestComment() { return $this->belongsToMany(Rating::class, 'comments', 'id')->orderBy('id', 'asc')->limit(1); }

app/Http/Controllers/VideosController.php

 public function index() { $videos = Videos::query(); $videos->with('episodes'); return view('videos.index')->with('videos', $videos->paginate(4)); }

recursos/vistas/videos/index.blade.php

 @foreach($videos as $video) <div> <h5>{{ $video->title }}</h5> Best comment rating: {{ best_comment($video, 'name') }} </div> @endforeach

Con mi solución hay muchas consultas. ¿Cuál es la mejor manera de imprimir el comentario mejor valorado?

Caja de arena de Laravel

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esta no es la solución más óptima, pero debería funcionar.

Primero obtenga las ID de los modelos de Video del objeto de paginación:

$ids = $videos->getCollection()->pluck('id');

Luego, úselos para unirse a las otras tablas, agrupándolos por video y eligiendo el ID de calificación más alto. Es posible que deba modificar esto si tiene otras columnas en su tabla de calificación, es decir, para que pueda clasificarlas mejor que usar su clave principal.

 $videoToRatingMap = Videos::query() ->whereIn('id', $ids) ->join('episodes', 'episodes.video_id', '=', 'videos.id') ->join('comments', 'comments.episode_id ', '=', 'episodes.id') ->join('ratings', 'ratings.id', '=', 'comments.rating_id') ->groupBy('videos.id') ->select('videos.id') ->selectRaw('max(ratings.id) as rating_id') ->get();

Esto le dará un mapa de los videos por ID y el comentario mejor clasificado.

Sin embargo, esto no le dará los nombres de las clasificaciones, eso se puede hacer en una consulta separada:

 $ratingNames = Rating::query() ->findMany($videoToRatingMap->pluck('rating_id')) ->pluck('name', 'id');

Luego transforme el mapa de calificación para incluir los nombres:

 $videoToRatingMap->transform(function($video) use ($ratingNames){ $video['rating_name'] = $ratingNames[$video['rating_id']]; return $video; })->keyBy('id');

Esto le dará una colección, codificada por las ID de video que también contiene la ID de calificación y su nombre.

Una forma un poco más óptima de hacer esto es tomar la primera consulta y envolver todo en una subconsulta, de esa manera podría unirse a la tabla de calificaciones nuevamente y obtener el nombre. Reduciría las consultas en una a costa de hacer que la consulta única sea más compleja.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda