Kohana 3 ORM: raggiungere valori più utilizzate, ordinate, e l'inserimento nel nuovo oggetto / array

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

  •  24-10-2019
  •  | 
  •  

Domanda

Quindi, un altro nella mia serie di domande Kohana 3 ORM:)

Ho, essenzialmente, una tabella pivot, denominata connections. La tabella connections collega un song ad un keyword. Ecco tutti i grandi e di lavoro (grazie ai miei ultimi due domande!)

Voglio uscita delle canzoni più collegati per parola chiave. Così, per interrogare in qualche modo mio tavolo connections e l'uscita di un oggetto (con un numero arbitrariamente limitato di iterazioni $n) che classifica le canzoni per il numero di volte in cui sono stati collegati, vale a dire. il numero di volte in quel particolare song_id appare per quel particolare keyword_id.

Non ho letteralmente idea di come raggiungere questo obiettivo, senza interrogare ogni singola riga (!!!) e poi contare quei singoli risultati in un array .... Ci deve essere un modo più elegante per raggiungere questo obiettivo?

È stato utile?

Soluzione

Credo che questo è più di una questione SQL. Utilizzando il generatore di query DB:

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 in 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`

dovrebbe restituire il risultato che si desidera.

Ti consigliamo di avere una proprietà accessibili chiamato nconnections nel modello canzone. Il modo più semplice per farlo è quello di aggiungere un membro del pubblico in modo da non manomettere funzionamento interno di ORM.


sto supponendo che si sta utilizzando un modello chiamato 'Song', legato a un tavolo 'canzoni', un modello di 'parola chiave' legata al tavolo un 'parole chiave' e nel 'collegamenti' tavolo 'chiavi esterne song_id' e 'keyword_id' per ogni modello, rispettivamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top