Je mets ça en aide-mémoire vu que j’ai un peu ramé pour créer une sous-requête avec condition sous Codeigniter 3.1.6, l’active record ne prenant pas en charge cette fonctionnalité.
Le but de la manoeuvre est de renvoyer 1 pour vrai si un utilisateur est présent dans la table users_groups et si le nom du groupe passé également en paramètre de la fonction est un groupe valide dans la table groups.
Pour réaliser cela, il faut donc sélectionner 1 quand l’id de l’utilisateur est égal à l’id de session utilisateur passé en paramètre et quand l’id du groupe est présent dans la table des groupes d’après son nom complet.
Active record ne permettant pas cela directement, la requête doit être lancée puis son résultat stocké dans une chaîne renvoyée par la méthode get_compiled_insert
([$table = »[, $reset = TRUE]]) chargée dans la variable $query que l’on jouera après, ce qui donne (faites super gaffe aux quotes et guillemets) :
$query = $this->db->select("(SELECT 1 as ok FROM users_groups WHERE user_id = '".$user_id."' and group_id = (select id from groups where name = '".$nom_complet_du_groupe."'))", FALSE)->get_compiled_select();
La chaine $query est chargée du contenu de la requête. On peut alors la lancer avec :
$query = $this->db->query($query);
A ce niveau, on serait tenté de lancer un simple return $query->result(); récupéré par le contrôleur. Malheureusement, il sera compliqué de récupérer simplement la valeur unitaire dans une variable à cause de l’erreur Array to string conversion.
Puisque l’on sait qu’on ne renvoie qu’une valeur, on utilise la méthode row() qui ne renvoie… qu’une valeur :
$dac = $query->row();
$dac est maintenant chargé. Comment le renvoyer le nom du champ ? Facilement en fait grâce au select 1 as ok…
Un simple :
return $dac->ok;
vous en convaincra.
C’en est fini. Nous avons créé notre requête avec un sous-select sous condition puis renvoyé un champ unique réglant ainsi le problème des erreurs Array to string conversion ou stdClass object.
Tout rassemblé, l’obtention du résultat se fait avec :
$query = $this->db->select("(SELECT 1 as ok FROM users_groups WHERE user_id = '".$user_id."' and group_id = (select id from groups where name = '".$nom_complet_du_groupe."'))", FALSE)->get_compiled_select(); $query = $this->db->query($query); $dac = $query->row(); return $dac->ok;