Question

J'ai deux tableaux:

Contestant et votes Votes Contestant hasMany

Je l'ai essayé de faire un compte (Vote.id) comme un vote pour que je puisse le placer sur la Recordset et juste les paginera mais je ne sais pas où le placer. Je l'ai fait sur le tableau des champs, mais il m'a donné le nombre total de votes quel que soit le candidat auquel ils appartiennent.

Les votes sont reliés entre eux dans le recordset Contestant donc ce que je n'était sur moi, je l'ai fait un compte (candidat à $ [Vote]), mais cela ne peut pas être paginé et mon client veut être en mesure de trier les concurrents par votes.

Est-il possible que je peux faire quelque chose comme ça sur mon point de vue:

tri ( 'vote', 'comptage (vote)'); ?>

Ou dois-je créer une requête qui fait un décompte pour tous les votes où Contestant.id = Votes.contestant_id?

Contrôleur Contestant:

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',

conditions $));         }

Était-ce utile?

La solution 2

Depuis CakePHP ne supporte pas le groupe par le comportement maîtrisable j'ai essayé une approche différente. Créer le paginate var pour le modèle de vote au lieu (Tout cela se fait dans le contrôleur Contestants):

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

Et maintenant, dans mon contrôleur, je fais ce qui suit:

function index() {
    $page = 'Contestants';
    $this->set('page', $page);  
    $conditions ["Contestant.active"] = 1;
    $this->set('contestants', $this->paginate($this->Contestant->Vote,$conditions));
}

Maintenant, les participants sont commandés par leur décompte total des votes, bien que je ne peux toujours pas comprendre comment placer le Contestant_votes comme une variable paginator puisque dans le record, il est dans un tableau de son propre et non dans l'un des tableaux de modèle utilisé pour paginer.

Merci Matt Huggins votre approche est celle qui m'a conduit à cette solution.

Autres conseils

Découvrez la réponse de deceze à cette question: CakePHP champ mathematic-calcul

Essentiellement, vous voulez faire quelque chose comme ça, je devine:

'contain' => array(
    'Vote' => array(
        'fields' => array('SUM(Vote.id) AS Contestant__votes'),
        'group'  => array('Vote.contestant_id'),
    )
)

Addition: Est-ce que vous voulez aussi trier par votes (total des voix) ascendant ou descendant? Si oui, vous ne pouvez pas le faire facilement par la méthode par défaut de pagination CakePHP.

Pour cela, vous avez besoin d'un peu tweak. Voici les détails sur cette astuce: CakePHP avancée Pagination - champ Tri dérivé

Nous espérons que vous trouveriez utile.

Merci Adnan

Pour la relation spécifique que vous définissez, vos besoins sont bien servis par contre-cache .

Vous devez définir un nouveau champ dans votre table contestants: vote_count. Ensuite, dans votre modèle de vote, vous devez mettre à jour légèrement la définition de $belongsTo:

class Votes extends AppModel
{
    var $belongsTo = array(
        'Contestant' => array( 'counterCache' => true )
    );
}

Maintenant, à chaque fois qu'un dossier de vote est enregistré, le champ vote_count du parent Contestant sera mis à jour. Maintenant, vous pouvez simplement trier par Contestant.vote_count comme vous le feriez pour tout autre domaine Contestant:

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...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top