Bonjour,
J'ai suivi la formation de création d'un framework maison et le tuto sur la gestion des permissions.
Je ne sais pas encore quel méthode de gestion de droits je vais utiliser mais une question se pose, comment intégrer une requête complexe de type LEFT JOIN.
Modifier la class find dans model.php pour intégrer au tableau les éléments ?
Créer une nouvelle class dans model.php permettant juste de passer une requête écrite :
public function req($sql){
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
}
utiliser la page user.php du dossier model
D'avance merci pour votre aide.
Voici ma méthode find générale !
public function find($data = array()){
// définition des valeurs par défaut en cas d'absence de paramètre à la fonction find
$fields = (isset($data'fields']))? $data'fields'] : '*';
$cond = (isset($data'where']))? $data'where'] : '1=1';
$limit = (isset($data'limit']))? $data'limit'] : ' LIMIT 20';
$order = (isset($data'order']))? $data'order'] : substr(lcfirst(get_class($this)), 0, 3).'_id DESC';
$table_to_join = (isset($data'join']'table']) && isset($data'join']'type']))? $data'join']'table'] : '';
$type_of_join = (isset($data'join']'type']))? $data'join']'type'] : '';
$join_cond = (isset($data'join']'table']) && isset($data'join']'type']) && isset($data'join']'condition']))? ' ON '.$data'join']'condition'] : '';
$group = (isset($data'group']))? $data'group'] : '';
/*si une condition WHERE est passé en attribut à la fonction find, on écrit le morceau de la futur requête préparé avec des tokkens
pour eviter les injections sql sinon on met par défaut comme condition 1=1*/
if($cond !== '1=1'){
foreach($cond as $k => $v){
$f1] = ' '.$k.' = ? ';
}
$m = implode(' AND ', $f1);
}else{
$m = '1=1';
}
$req = 'SELECT '.$fields.' FROM '.lcfirst(get_class($this)).'s '.$type_of_join.' '.$table_to_join.' '.$join_cond.
' WHERE '.$m.' '.$group.' ORDER BY '.$order.' '.$limit;
echo $req.'<br>'; //<-- affichera la requête SQL finale avant sa préparation et l'insertion des variables sécurisées
// on essaye d'executer le bloc ci dessous ..
try{
if($cond !== '1=1'){
//préparation de la requete ..
$result = Model::$dbi->prepare($req);
//attribution dynamique des variables de condition
foreach($cond as $vv){
$param] = $vv;
}
$result->execute($param);
}else{
// sinon aucun paramètre fourni, execution d'une requête simple
$result = Model::$dbi->query($req);
}
//fermeture du curseur.
}
catch(PDOException $e){
echo 'Erreur :' .$e->getMessage();
}
$data = array();
while($line = $result->fetch(PDO::FETCH_ASSOC)){
$data] = $line;
}
$result->closeCursor();
return $data;
}
et voici un exemple d'action dans un controlleur avec la methode find et une jointure :
/**
*@return $article la liste des articles du blog + les catégories qui leurs sont associées
**/
public function index(){
$this->loadModel('Article');
$this->layout = 'main';
$data = $this->Article->find(array('fields' => 'art_title, art_content, art_dateC, cat_name',
'where' => array(
'art_slot' => 'blog',
'art_online' => true),
'join' => array(
'type' => 'LEFT OUTER JOIN',
'table' => 'categories',
'condition' => 'art_cat_id = cat_id')));
$this->set('article', $data);
$this->render('index');
}
Voilà en espérant cela puisse t'aider à t'inspirer :)
Merci pour ce coup de main même si je répond très tard...
Alors je m'y remet juste maintenant et après plusieurs test j'ai juste ajouté les lignes :
// Construction de la jonction
if(isset($req'jonction'])){
$sql .= ' FROM '.$this->table.' as '.$this->table.' '.$req'jonction'].' ';
}else{
$sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
}
dans la fonction de base (du tuto).
Ce qui me permet de pouvoir fair plusieurs jonctions dans une requête.
Peux être que je serais amené à la modifier plus tard.