Impaginazione con hasMany associazione cakePHP
-
22-09-2019 - |
Domanda
Ho due tabelle:
Concorrente e Voti Concorrente hasMany Voti
Ho provato a fare un conteggio (Vote.id) come Voti così posso posizionarlo sul recordset e solo loro impaginare, ma non ho idea di dove collocarlo. L'ho fatto sulla matrice campi, ma mi ha dato il numero totale dei voti indipendentemente dal concorrente a cui appartengono.
I voti sono collegati tra loro nel recordset Concorrente così quello che ha fatto è stato il mio punto di vista ho fatto un conteggio ($ concorrente [Vota]), ma questo non può essere impaginato e il mio cliente vuole essere in grado di ordinare i concorrenti dal voti.
C'è un modo per fare qualcosa di simile sul mio punto di vista:?
ordinamento ( 'votazioni', 'count (votazione)'); ?>
O devo creare una query che fa un conteggio di tutti i voti dove Contestant.id = Votes.contestant_id?
Regolatore Concorrente:
function index() {
$page = 'Contestants';
$this->set('page', $page);
$this->paginate =
array(
'order' => 'id ASC',
'contain' => array(
'Vote' => array(
'fields' => array("Vote.contestant_id",'Vote.id')
)
)
$conditions ["Contestant.active"] = 1;
$this->set('contestants', $this->paginate('Contestant',
$ condizioni)); }
Soluzione 2
Poiché cakephp non supporta raggruppa per comportamento contenibile ho provato un approccio diverso. Creare la var paginate per il modello di voto, invece (Tutto questo viene fatto nel Controller concorrenti):
var $paginate = array(
'Vote'=>array(
'limit'=>5,
'fields' => array(
'Contestant.*, count(Vote.contestant_id) as Contestant_votes, Vote.id'
),
'group' => array(
'Vote.contestant_id'
),
'order' => array(
'Contestant_votes Desc'
)
),
'Contestant'=>array(
'limit'=>5,
'order' => array(
'Contestant.id Desc'
)
)
);
E ora nel mio controller faccio la seguente:
function index() {
$page = 'Contestants';
$this->set('page', $page);
$conditions ["Contestant.active"] = 1;
$this->set('contestants', $this->paginate($this->Contestant->Vote,$conditions));
}
Ora i concorrenti sono ordinate per il loro bottino totale di voto, anche se ancora non riesco a capire come posizionare il Contestant_votes come variabile paginator poiché nel record set è in una serie di essa la propria e non in una qualsiasi delle matrici modello usato per impaginare.
Grazie Matt Huggins tuo approccio è stato quello che mi ha portato a questa soluzione.
Altri suggerimenti
Controlla la risposta di deceze in questa domanda:? CakePHP campo matematico calcolo
In sostanza si vuole fare qualcosa di simile sto cercando di indovinare:
'contain' => array(
'Vote' => array(
'fields' => array('SUM(Vote.id) AS Contestant__votes'),
'group' => array('Vote.contestant_id'),
)
)
Aggiunta: Volete anche ordinare per numero di voti (voti totali) ascendente o discendente? Se sì, non si può fare facilmente con il metodo impaginazione di default di CakePHP.
Per questo è necessario un piccolo trucco. Ecco i dettagli su questo trucco: CakePHP avanzata paginazione - campo di ordinamento dal derivato
Spero che si può trovare utile.
Grazie Adnan
Per la specifica relazione si definisce, le vostre esigenze sono ben servito da contro-caching .
Sarà necessario definire un nuovo campo nella tabella contestants
: vote_count
. Poi, nel modello Voti, è necessario aggiornare un po 'la definizione $belongsTo
:
class Votes extends AppModel
{
var $belongsTo = array(
'Contestant' => array( 'counterCache' => true )
);
}
Ora, ogni volta che un record di voto è stato salvato, il campo vote_count
del genitore Concorrente sarà aggiornato. Ora si può semplicemente ordina per Contestant.vote_count
come si farebbe con qualsiasi altro campo Concorrente:
class ContestantsController extends AppController
{
// Controller stuff that comes before...
function index()
{
$this->paginate = array( 'Contestant' => array(
'conditions' => array( 'Contestant.active' => 1 ),
'order' => array( 'Contestant.vote_count' => 'DESC' ),
));
$contestants = $this->paginate('Contestants');
$this->set( compact('contestants'));
}
// Controller stuff that comes after...
}