Kohana 3 Orm: Obtener la mayoría de los valores repetidos, clasificarse e insertar en un nuevo objeto / matriz

StackOverflow https://stackoverflow.com/questions/4797883

  •  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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top