Kohana 3 Orm: Obtener la mayoría de los valores repetidos, clasificarse e insertar en un nuevo objeto / matriz
-
24-10-2019 - |
Pregunta
Entonces, otro de mi serie de preguntas de Kohana 3 Orm :)
Tengo, esencialmente, una mesa de pivote, llamada connections
. los connections
La tabla conecta un song
a un keyword
. Eso es genial y funcionando (¡gracias a mis dos últimas preguntas!)
Quiero generar las canciones más conectadas por palabra clave. Entonces, para consultar de alguna manera mi connections
Tabla y salida de un objeto (con un número arbitrariamente limitado de iteraciones $n
) que clasifica las canciones por la cantidad de veces que han sido conectadas, es decir. el número de veces ese particular song_id
aparece para ese particular keyword_id
.
Literalmente, no tengo idea de cómo lograr esto, sin consultar cada fila (!!!) y luego contar esos resultados individuales en una matriz ... ¿Debe haber una forma más elegante de lograr esto?
Solución
Creo que esto es más una pregunta SQL. Usando el DB Consulter Builder:
DB::select('songs.*')->select(array('COUNT("keywords.id")', 'nconnections'))
->from('songs')
->join('connections', 'LEFT')->on('connections.song_id', '=', 'songs.id')
->join('keywords', 'LEFT')->on('connections.keyword_id', '=', 'keywords.id')
->group_by('songs.id')
->order_by('nconnections')
->as_object('Model_Song')
->execute();
o en SQL
SELECT `songs`.*, COUNT(`keywords`.`id`) AS `nconnections` FROM songs
LEFT JOIN `connections` ON `connections`.`song_id` = `songs`.`id`
LEFT JOIN `keywords` ON `connections`.`keyword_id` = `keywords`.`id`
GROUP BY `songs`.`id` ORDER BY `nconnections`
Debe devolver el resultado que desee.
Querrá tener una propiedad accesible llamada nconnections
en tu modelo de canción. La forma más sencilla de hacerlo es agregar un miembro público para que no manipule el funcionamiento interno de Orm.
Supongo que está utilizando un modelo llamado 'canción', vinculado a una tabla de 'canciones', un modelo de 'palabra clave' vinculada a una tabla de 'palabras clave' y en la tabla 'conexiones' claves extranjeras 'song_id' y 'palabras clave_id 'Para cada modelo respectivamente.