Bonjour,

Je développe une petite appli pour une asso étudiante, leur permettant de gérer les inscriptions à leur événement.

Je cherche à afficher un classement par nombre d'inscrits par école en précisant le nombre de diplômés parmis ces inscrits.

Voici le code pour le classement des écoles par inscrits :

$q = $this->Users->Schools->find();
        $q->select([
            'total_inscrit' => $q->func()->count('Users.id'),
        ])->innerJoinWith('Users.EventsUsers', function ($q) use ($event_id) {
                return $q->where(['EventsUsers.event_id' => $event_id]);
            })
            ->group(['Schools.id'])
            ->order(['total_inscrit' => 'DESC'])
            ->autoFields(true);

Ma difficulté est d'arriver à sortir un sous-total - proprement - avec Users.promo_id = 5

Cette requête SQL fonctionne mais elle est un peu bourrine.

SELECT ( COUNT(Users.id) ) AS `total_inscrit`, (SELECT COUNT(U.id) FROM schools SCH INNER JOIN users U ON SCH.id = U.school_id AND U.promo_id = 5 INNER JOIN events_users E ON E.event_id = 7 AND U.id = E.user_id WHERE SCH.id = Schools.id ) AS `total_DE`, Schools.id AS `Schools__id`, Schools.name AS `Schools__name` FROM schools Schools INNER JOIN users Users ON Schools.id = (Users.school_id) INNER JOIN events_users EventsUsers ON ( EventsUsers.event_id = 7 AND Users.id = (EventsUsers.user_id) ) GROUP BY Schools.id ORDER BY total_inscrit DESC

Je suis persuadé qu'il y a moyen de sortir ça avec Cakephp mais je ne trouve pas, je m'en donc remets à vos connaissances.
Merci beaucoup pour l'aide que vous pourrez m'apporter!

1 réponse


J'arrive également au bon résultat comme ça... Mais ça ne me plait toujours pas.

$q = $this->Users->Schools->find();
        $q->innerJoinWith('Users.EventsUsers', function ($q) use ($event_id) {
                return $q->where(['EventsUsers.event_id' => $event_id]);
            })
            ->group(['Schools.id'])
            ->order(['total_inscrit' => 'DESC'])
            ->autoFields(true);
        $qDE = $q;

        $q->select([
            'total_inscrit' => $q->func()->count('Users.id'),
        ]);

        $clt = $q->toArray();

        $qDE->where(['Users.promo_id' => 5])->toArray();

        $cltDE = $qDE->toArray();

        foreach($clt as $a => $k) {
            if(isset($cltDE[$a]->total_inscrit)) {
                $clt[$a]['total_DE'] = $cltDE[$a]->total_inscrit;   
            } else {
                $clt[$a]['total_DE'] = 0;
            }
        }

        return $clt;