Kohana 3 ORM: raggiungere valori più utilizzate, ordinate, e l'inserimento nel nuovo oggetto / array
-
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?
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.