From 779a36073ef6091b3873243aee4989a65d93d9a5 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 23 Jul 2016 09:42:35 +0200 Subject: [PATCH] =?UTF-8?q?Gestion=20pour=20l'ORM=20des=20diff=C3=A9rentes?= =?UTF-8?q?=20conditions=20'<',=20'<=3D',=20'>',=20'>=3D',=20'=3D'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/ORM/Rows.php | 89 +++++++++++++++++++++++++++++++------------- test/automate.php | 21 ++++++----- 2 files changed, 76 insertions(+), 34 deletions(-) diff --git a/manager/ORM/Rows.php b/manager/ORM/Rows.php index a363d6c..ebfc3ea 100644 --- a/manager/ORM/Rows.php +++ b/manager/ORM/Rows.php @@ -7,6 +7,15 @@ class Rows{ + + /* CONSTANTES */ + const COND_EQUAL = '='; + const COND_INF = '<'; + const COND_SUP = '>'; + const COND_INFEQ = '<='; + const COND_SUPEQ = '>='; + const COND_LIKE = '>='; + /* Attributs */ private $where; // Tableau associatif contenant les conditions private $select; // Tableau contenant la liste des champs à afficher @@ -69,15 +78,23 @@ =========================================================*/ if( count($keys) == 1 ){ - /* (1) Si type INT et pas numérique */ - if( $this->schema['columns'][$keys[0]]['type'] == 'int' && !is_numeric($primary) ) + /* (1) Si on a juste la valeur, on ajoute le type de condition */ + if( !is_array($primary) ) + $primary = [ $primary, self::COND_EQUAL ]; + + /* (2) Si type INT et pas numérique */ + if( $this->schema['columns'][$keys[0]]['type'] == 'int' && !is_numeric($primary[0]) ) return $this; - /* (2) Si type STRING et pas string */ - if( $this->schema['columns'][$keys[0]]['type'] == 'text' && !is_string($primary) ) + /* (3) Si type FLOAT et pas numérique */ + if( $this->schema['columns'][$keys[0]]['type'] == 'float' && !is_numeric($primary[0]) ) return $this; - /* (3) Si type OK, on enregistre la condition */ + /* (4) Si type STRING et pas string */ + if( $this->schema['columns'][$keys[0]]['type'] == 'text' && !is_string($primary[0]) ) + return $this; + + /* (5) Si type OK, on enregistre la condition */ $this->where[$keys[0]] = $primary; @@ -90,19 +107,30 @@ /* (1) Pour chaque clé, On vérifie les TYPES */ foreach($keys as $i=>$key){ - /* (2) Si type INT et pas numérique */ - if( $this->schema['columns'][$key]['type'] == 'int' && !is_numeric($primary[$i]) ){ - $this->where = $defaultWhere; // On réinitialise les données si au moins 1 clé est fausse + + /* (2) Si c'est un paramètre seul, on ajoute par défaut self::COND_EQUAL */ + if( !is_array($primary[$i]) ) + $primary[$i] = [ $primary[$i], self::COND_EQUAL ]; + + /* (3) Si type INT et pas numérique */ + if( $this->schema['columns'][$column_name]['type'] == 'int' && !is_numeric($primary[$i][0]) ){ + $this->where = $defaultWhere; // On réinitialise les conditions si au moins 1 est fausse return $this; } - /* (3) Si type STRING et pas string */ - if( $this->schema['columns'][$key]['type'] == 'text' && !is_string($primary[$i]) ){ - $this->where = $defaultWhere; // On réinitialise les données si au moins 1 clé est fausse + /* (4) Si type FLOAT et pas numérique */ + if( $this->schema['columns'][$column_name]['type'] == 'float' && !is_numeric($primary[$i][0]) ){ + $this->where = $defaultWhere; // On réinitialise les conditions si au moins 1 est fausse return $this; } - /* (3) Si type OK, on enregistre la condition */ + /* (5) Si type STRING et pas string */ + if( $this->schema['columns'][$column_name]['type'] == 'text' && !is_string($primary[$i][0]) ){ + $this->where = $defaultWhere; // On réinitialise les conditions si au moins 1 est fausse + return $this; + } + + /* (6) Si type OK, on enregistre la condition */ $this->where[$key] = $primary[$i]; } @@ -123,7 +151,8 @@ /* GETTERS DYNAMIQUES * * @method Nom de la méthode - * @parameters Tableau contenant les paramètres + * @parameter Valeur du paramètre + * @parameter Valeur du paramètre + type de vérification (tableau) * * @return this Retourne l'object courant * @@ -157,25 +186,33 @@ /* [2] On vérifie le type du paramètre =========================================================*/ - /* (1) Si aucun param, on quitte */ if( count($a) == 0 ) return $this; - /* (2) Si type INT et pas numérique */ - if( $this->schema['columns'][$column_name]['type'] == 'int' && !is_numeric($a[0]) ) + /* (2) Si c'est un paramètre seul, on ajoute par défaut self::COND_EQUAL */ + if( !is_array($a[0]) ) + $a[0] = [ $a[0], self::COND_EQUAL ]; + + /* (3) Si type INT et pas numérique */ + if( $this->schema['columns'][$column_name]['type'] == 'int' && !is_numeric($a[0][0]) ) return $this; - /* (3) Si type STRING et pas string */ - if( $this->schema['columns'][$column_name]['type'] == 'text' && !is_string($a[0]) ) + /* (4) Si type FLOAT et pas numérique */ + if( $this->schema['columns'][$column_name]['type'] == 'float' && !is_numeric($a[0][0]) ) return $this; + /* (5) Si type STRING et pas string */ + if( $this->schema['columns'][$column_name]['type'] == 'text' && !is_string($a[0][0]) ) + return $this; + + /* [3] Si type OK, on enregistre la condition =========================================================*/ $this->where[$column_name] = $a[0]; - + // On retourne l'object courant return $this; } @@ -384,8 +421,8 @@ /* (1) On met les conditions locales */ $c = 0; foreach($this->where as $field=>$value){ - if( $c == 0 ) $requestS .= 'WHERE '.$this->schema['table'].'.'.$field.' = :'.$this->schema['table'].'_x_'.$field."\n"; - else $requestS .= 'AND '.$this->schema['table'].'.'.$field.' = :'.$this->schema['table'].'_x_'.$field."\n"; + if( $c == 0 ) $requestS .= 'WHERE '.$this->schema['table'].'.'.$field.' '.$value[1].' :'.$this->schema['table'].'_x_'.$field."\n"; + else $requestS .= 'AND '.$this->schema['table'].'.'.$field.' '.$value[1].' :'.$this->schema['table'].'_x_'.$field."\n"; $c++; } @@ -400,8 +437,8 @@ /* (3) On ajoute les conditions des jointures */ foreach($this->joined as $rows) foreach($rows->where as $field=>$value){ - if( $c == 0 ) $requestS .= 'WHERE '.$rows->schema['table'].'.'.$field.' = :'.$rows->schema['table'].'_x_'.$field."\n"; - else $requestS .= 'AND '.$rows->schema['table'].'.'.$field.' = :'.$rows->schema['table'].'_x_'.$field."\n"; + if( $c == 0 ) $requestS .= 'WHERE '.$rows->schema['table'].'.'.$field.' '.$value[1].' :'.$rows->schema['table'].'_x_'.$field."\n"; + else $requestS .= 'AND '.$rows->schema['table'].'.'.$field.' '.$value[1].' :'.$rows->schema['table'].'_x_'.$field."\n"; $c++; } @@ -415,17 +452,19 @@ /* (1) On bind tous les paramètres locaux */ foreach($this->where as $field=>$value) - $binded[':'.$this->schema['table'].'_x_'.$field] = $value; + $binded[':'.$this->schema['table'].'_x_'.$field] = $value[0]; /* (3) On bind tous les paramètres des jointures */ foreach($this->joined as $rows) foreach($rows->where as $field=>$value) - $binded[':'.$rows->schema['table'].'_x_'.$field] = $value; + $binded[':'.$rows->schema['table'].'_x_'.$field] = $value[0]; /* [6] On exécute la requête et retourne le résultat =========================================================*/ + var_dump($requestS); + var_dump($binded); /* (1) On exécute la requête */ $request->execute($binded); diff --git a/test/automate.php b/test/automate.php index c830ec6..a2903c7 100755 --- a/test/automate.php +++ b/test/automate.php @@ -342,17 +342,20 @@ debug(); - $warehouse = Table::get('warehouse')->getByName('stef-montauban'); + $warehouse = + Table::get('warehouse') // Access to table 'warehouse' + ->getByName('stef-montauban'); // condition : name = 'my-warehouse' $myUser = - Table::get('user') - ->getById(3) // PRIMARY KEY (if composed, all arguments in array) - ->getByUsername('gediaz') // Dynamic getter 'getByMySuperColumn' -> 'my_super_column' - ->select(['mail', 'username', 'firstname']) - ->select('id_user') - ->unique() - ->join('id_warehouse', $warehouse) - ->fetch(); + Table::get('user') // Access to table 'user' + ->getById([3, Rows::COND_SUP]) // PRIMARY KEY (if composed, all arguments in array) + // ->getById([10, Rows::COND_INF]) // PRIMARY KEY (if composed, all arguments in array) + // ->getByUsername('gediaz') // Dynamic getter 'getByMySuperColumn' -> 'my_super_column' + ->select(['mail', 'username', 'firstname']) // Select clause + ->select('id_user') // Select clause (added) + ->join('id_warehouse', $warehouse) // joins warehouse (with name 'my-warehouse') to column 'id_warehouse' + // ->unique() // unique result + ->fetch(); // Result var_dump($myUser);