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));         }

È stato utile?

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...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top