From 7626adf3d5c8d407b6e705170267d6cfec552679 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 5 Nov 2016 19:08:14 +0100 Subject: [PATCH] Fetch des relations done --- build/orm/core/Rows.php | 85 ++++++++++++++++++------- public_html/test/Lab-Surveys-Import.php | 15 +++-- 2 files changed, 74 insertions(+), 26 deletions(-) diff --git a/build/orm/core/Rows.php b/build/orm/core/Rows.php index e748764..d139263 100644 --- a/build/orm/core/Rows.php +++ b/build/orm/core/Rows.php @@ -188,16 +188,17 @@ $column_name = ''; /* (1) formatte la requête 'MyAttribute' -> 'my_attribute' */ - for( $l = 0 ; $l < strlen($regex[1]) ; $l++ ){ + for( $l = 0, $ll = strlen($regex[1]) ; $l < $ll ; $l++ ){ $letter = $regex[1][$l]; - // Si la lettre est en majuscule mais que c'est pas la première + // Si la lettre est en majuscule mais que c'est pas la première ni un seul mot if( strtoupper($letter) == $letter && $l > 0 ) $column_name .= '_'; $column_name .= strtolower($letter); } + /* (2) On vérifie que la colonne existe */ if( !isset($this->schema['columns'][$column_name]) ) return $this; // si n'existe pas, on ne fait rien @@ -205,44 +206,86 @@ /* [2] On vérifie le type du paramètre =========================================================*/ - /* (1) Si aucun param, on quitte */ - if( count($a) == 0 ) + // On délègue + $args = array_merge([$column_name], $a); + return call_user_func_array([$this, 'where'], $args); + } + + + public function where($field){ + // get arguments + $args = array_slice(func_get_args(), 1); + + /* [1] Vérification de l'argument @field + =========================================================*/ + /* (1) Type de @field */ + if( !is_string($field) ) return $this; - /* (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 ]; + /* (2) On vérifie que la colonne existe */ + if( !isset($this->schema['columns'][$field]) ) + return $this; // si n'existe pas, on ne fait rien - /* (3) Si type INT et pas numérique */ - if( $this->schema['columns'][$column_name]['type'] == 'int' && !is_numeric($a[0][0]) ) + /* [2] On vérifie le type du paramètre + =========================================================*/ + /* (1) Si au moins 1 param */ + if( count($args) < 1 ) return $this; - /* (4) Si type FLOAT et pas numérique */ - if( $this->schema['columns'][$column_name]['type'] == 'float' && !is_numeric($a[0][0]) ) + + /* [3] If `IN` condition + =========================================================*/ + $defaultWhere = $this->where; + $inCond = count($args[0]) > 1 && is_array($args[0][0]) && $args[0][1] == self::COND_IN; + + // erreur + if( is_array($args[0][0]) && !$inCond ) return $this; - /* (5) Si type STRING et pas string */ - if( $this->schema['columns'][$column_name]['type'] == 'text' && !is_string($a[0][0]) ) - return $this; + /* (1) Si c'est une condition "IN" + ---------------------------------------------------------*/ + if( $inCond ){ + /* (1) On vérifie le type de chaque valeur du IN */ + $type = $this->schema['columns'][$field]['type']; + + foreach($args[0][0] as $value){ + if( $type == 'int' && !is_numeric($value) ) return $this; + if( $type == 'float' && !is_numeric($value) ) return $this; + if( in_array($type, ['text', 'varchar']) && !is_string($value) ) return $this; + } + + /* (2) Si c'est une condition "simple" + ---------------------------------------------------------*/ + }else{ + + /* (1) Si le type de condition est manquant, on met EQUAL par défaut */ + if( !is_array($args[0]) ) + $args[0] = [ $args[0], self::COND_EQUAL ]; + + /* (2) On vérifie le type de chaque valeur */ + $type = $this->schema['columns'][$field]['type']; + + if( $type == 'int' && !is_numeric($args[0][0]) ) return $this; + if( $type == 'float' && !is_numeric($args[0][0]) ) return $this; + if( in_array($type, ['text', 'varchar']) && !is_string($args[0][0]) ) return $this; + + } /* [3] Si type OK, on enregistre la condition =========================================================*/ /* (1) Si aucune condition pour ce champ, on crée un tableau */ - if( !isset($this->where[$column_name]) ) - $this->where[$column_name] = []; + if( !isset($this->where[$field]) ) + $this->where[$field] = []; /* (2) On ajoute la condition */ - $this->where[$column_name][] = $a[0]; - - + $this->where[$field][] = $args[0]; // On retourne l'object courant return $this; } - /* SELECTIONNE UNIQUEMENT LE CHAMP SELECTIONNE * * @field Libellé du champ à afficher @@ -844,7 +887,6 @@ // On ajoute la clause FROM de jointure à la clause FROM locale // $requestS['FROM'] = array_merge($data['request']['FROM'], $requestS['FROM']); - /* [5] On rédige la clause WHERE/AND =========================================================*/ /* (1) On met les conditions locales */ @@ -946,7 +988,6 @@ /* (3) On prépare la requête */ $request = DatabaseDriver::getPDO($this->driver)->prepare($requestString); - // var_dump($requestString); /* [8] On exécute la requête et retourne le résultat diff --git a/public_html/test/Lab-Surveys-Import.php b/public_html/test/Lab-Surveys-Import.php index 804c767..997903e 100644 --- a/public_html/test/Lab-Surveys-Import.php +++ b/public_html/test/Lab-Surveys-Import.php @@ -138,12 +138,15 @@ ->unique(); $A = Table::get('sujets', 'lab-surveys') - ->select('pseudo', null, null, 'A') + ->select('idSujet') ->join('idEtude', $lisst) - ->orderby('idSujet'); + ->orderby('idSujet') + ->fetch(); + $Ain = []; + foreach($A as $i=>$v) + $Ain[] = $v['idSujet']; $B = Table::get('sujets', 'lab-surveys') - ->select('pseudo', null, null, 'B') ->join('idEtude', $lisst) ->orderby('idSujet'); @@ -151,7 +154,11 @@ ->select('intitule', null, null, 'categorie'); $rel = Table::get('relations', 'lab-surveys') - ->join('idSujetA', $A) + ->select('idSujetA', Rows::SEL_CONCAT) + ->select('idSujetB') + ->select('knows') + ->select('isEgo') + ->where('idSujetA', [$Ain, Rows::COND_IN]) ->join('idSujetB', $B) ->join('idCategorieRelation', $cate);