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!
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;