From fd970b7de6a8370db53162fb80fe3e931d3e6830 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 5 Nov 2016 16:13:14 +0100 Subject: [PATCH] =?UTF-8?q?Gestion=20des=20alias=20dans=20`orm/Rows`=20+?= =?UTF-8?q?=20Gestion=20de=20la=20reconnaissance=20des=20types=20des=20cha?= =?UTF-8?q?mps=20=C3=A0=20partir=20du=20"vrai"=20champ=20concern=C3=A9=20(?= =?UTF-8?q?fonctionne=20aussi=20avec=20les=20fonctions=20d'aggr=C3=A9gatio?= =?UTF-8?q?n)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/orm/core/Rows.php | 35 ++++++++++++---- build/orm/core/SQLBuilder.php | 78 +++++------------------------------ 2 files changed, 36 insertions(+), 77 deletions(-) diff --git a/build/orm/core/Rows.php b/build/orm/core/Rows.php index 1560ffd..9c7397b 100644 --- a/build/orm/core/Rows.php +++ b/build/orm/core/Rows.php @@ -248,11 +248,12 @@ * @field Libellé du champ à afficher * @func Fonction d'aggrégation (ou NULL) * @distinct Clause DISTINCT + * @alias Alias du champ * * @return this Retourne l'object courant * */ - public function select($field=null, $func=null, $distinct=false){ + public function select($field=null, $func=null, $distinct=false, $alias=null){ /* [1] On formatte les champs =========================================================*/ /* (1) On vérifie le type de @field */ @@ -273,6 +274,9 @@ /* (4) On met la valeur par défaut à @distinct si type mauvais */ $distinct = !is_bool($distinct) ? false : $distinct; + /* (5) Si @alias incorrect, on met @field par défaut */ + if( !is_string($alias) ) + $alias = $field; /* [2] On enregistre le champ =========================================================*/ @@ -281,13 +285,13 @@ foreach($this->schema['columns'] as $f=>$c) if( !isset($this->select[$f]) ) - $this->select[$f] = [$func, $distinct]; + $this->select[$f] = [$func, $distinct, $alias]; /* (2) Si aucun SELECT pour ce champ, on le crée */ }else{ if( !isset($this->select[$field]) ) - $this->select[$field] = [$func, $distinct]; + $this->select[$field] = [$func, $distinct, $alias]; } @@ -1002,32 +1006,45 @@ if( !$twoDimensions ) $formatted = [$formatted]; - /* (2) On retire les indices numériques */ + + /* (2) On récupère les noms des champs à partir des select (alias) */ // {1} On récupère les colonnes locales // - $existingColumns = $this->schema['columns']; + $existingColumns = []; + + foreach($this->select as $field=>$data) + $existingColumns[$data[2]] = $this->schema['columns'][$field]; + // {2} On ajoute les colonnes des jointures // foreach($this->joined as $j) - $existingColumns = array_merge( $existingColumns, $j['object']->schema['columns'] ); + foreach($j['object']->select as $field=>$data) + $existingColumns[$data[2]] = $j['object']->schema['columns'][$field]; + // {3} On vérifie chaque clé, si c'est une colonne qui existe // foreach($formatted as $i=>$entry) // Pour chaque champ - foreach($entry as $index=>$value) + foreach($entry as $index=>$value){ // Si la colonne existe on applique le type if( isset($existingColumns[$index]) ){ if( $existingColumns[$index]['type'] == 'int' ) $formatted[$i][$index] = intval( $value ); - else if( $existingColumns[$index]['type'] == 'float' ) + elseif( $existingColumns[$index]['type'] == 'float' ) $formatted[$i][$index] = floatval( $value ); + // String utf8 management + elseif( \mb_detect_encoding($value) === 'UTF-8' ) + $formatted[$i][$index] = utf8_encode($value); + else + $formatted[$i][$index] = utf8_encode(utf8_decode($value)); // Si pas non plus une aggrégation et si indice numérique, on le retire - }else if( !preg_match('/^agg_.+/', $index) && is_numeric($index) ) + }else if( !preg_match('/^agg_.+/', $index) && is_numeric($index) ) unset($formatted[$i][$index]); + } /* (3) On remet 1 dimension si 1 dimension à la base */ if( !$twoDimensions ) diff --git a/build/orm/core/SQLBuilder.php b/build/orm/core/SQLBuilder.php index 7a92c11..99bc59f 100644 --- a/build/orm/core/SQLBuilder.php +++ b/build/orm/core/SQLBuilder.php @@ -21,11 +21,6 @@ } - - - - - /* CONSTRUIT LA REQUETE FORMATTEE "ORDER BY" AVEC UNE LISTE DE CHAMPS * * @tables Liste de champs : [table => fields] @@ -37,12 +32,6 @@ return $tables; } - - - - - - /* CONSTRUIT LA REQUETE FORMATTEE "GROUP BY" AVEC UNE LISTE DE CHAMPS * * @tables Liste de champs : [table => fields] @@ -55,10 +44,6 @@ } - - - - /* CONSTRUIT LA REQUETE FORMATTEE "FROM" AVEC UNE LISTE DE TABLES * * @tables Liste de tables OU SQL PUR @@ -71,10 +56,6 @@ } - - - - /* CONSTRUIT LA REQUETE FORMATTEE "UPDATE" AVEC LA TABLE EN QUESTION * * @table Table en question @@ -87,10 +68,6 @@ } - - - - /* CONSTRUIT LA REQUETE FORMATTEE "DELETE" AVEC LA TABLE EN QUESTION * * @table Table en question @@ -103,10 +80,6 @@ } - - - - /* CONSTRUIT LA REQUETE TEXTUELLE "IN" AVEC UNE LISTE DE TABLES * * @field Tableau contenant [table, field] @@ -140,13 +113,7 @@ } return $sql.")"; - } - - - - - - /* CONSTRUIT LA REQUETE TEXTUELLE "WHERE" AVEC UNE LISTE DE TABLES + } /* CONSTRUIT LA REQUETE TEXTUELLE "WHERE" AVEC UNE LISTE DE TABLES * * @field Tableau contenant [table, field] * @valeur Valeurs de la clause WHERE [valeur, opérateur] @@ -177,13 +144,7 @@ return $sql; - } - - - - - - /* CONSTRUIT LA REQUETE FORMATTEE "SET" AVEC UNE LISTE DE TABLES + } /* CONSTRUIT LA REQUETE FORMATTEE "SET" AVEC UNE LISTE DE TABLES * * @values Tableau de la forme [ field=>value, field2=>value2 ] * @bound Tableau associatif contenant les variables "bindés" -> ajout des champs @@ -213,13 +174,7 @@ } return $sql; - } - - - - - - /* CONSTRUIT LA REQUETE FORMATTEE "LIMIT" AVEC UN NOMBRE D'ENTREES + } /* CONSTRUIT LA REQUETE FORMATTEE "LIMIT" AVEC UN NOMBRE D'ENTREES * * @count Nombre limite * @@ -240,18 +195,6 @@ return $sql; } - - - - - - - - - - - - /* CONSTRUIT LA REQUETE A PARTIR D'UNE REQUETTE FORMATTEE * * @request Requête formattée @@ -275,7 +218,7 @@ case 'SELECT': $sql .= "SELECT "; $c = 0; - foreach($statements as $table=>$fields) + foreach($statements as $table=>$fields){ foreach($fields as $field=>$select){ /* (1) On construit le nom du champ */ @@ -291,7 +234,11 @@ /* (4) On ajoute l'alias */ - if( isset($select[0]) && !is_null($select[0]) ) + // si défini + if( isset($select[2]) ) + $fieldStr = "$fieldStr as ".$select[2]; + // si func et non défini + elseif( isset($select[0]) && !is_null($select[0]) ) $fieldStr = "$fieldStr as agg_$field"; else $fieldStr = "$fieldStr"; @@ -300,6 +247,7 @@ $c++; } + } $sql .= "\n"; break; @@ -409,12 +357,6 @@ } - - - - - - /* [2] On retourne le résultat =========================================================*/ return $sql;