Gestion des alias dans `orm/Rows` + Gestion de la reconnaissance des types des champs à partir du "vrai" champ concerné (fonctionne aussi avec les fonctions d'aggrégation)

This commit is contained in:
xdrm-brackets 2016-11-05 16:13:14 +01:00
parent ce44ff1baa
commit 9d447fc170
2 changed files with 36 additions and 77 deletions

View File

@ -248,11 +248,12 @@
* @field<String> Libellé du champ à afficher * @field<String> Libellé du champ à afficher
* @func<CONST> Fonction d'aggrégation (ou NULL) * @func<CONST> Fonction d'aggrégation (ou NULL)
* @distinct<Boolean> Clause DISTINCT * @distinct<Boolean> Clause DISTINCT
* @alias<String> Alias du champ
* *
* @return this<Rows> Retourne l'object courant * @return this<Rows> 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 formatte les champs
=========================================================*/ =========================================================*/
/* (1) On vérifie le type de @field */ /* (1) On vérifie le type de @field */
@ -273,6 +274,9 @@
/* (4) On met la valeur par défaut à @distinct si type mauvais */ /* (4) On met la valeur par défaut à @distinct si type mauvais */
$distinct = !is_bool($distinct) ? false : $distinct; $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 /* [2] On enregistre le champ
=========================================================*/ =========================================================*/
@ -281,13 +285,13 @@
foreach($this->schema['columns'] as $f=>$c) foreach($this->schema['columns'] as $f=>$c)
if( !isset($this->select[$f]) ) 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 */ /* (2) Si aucun SELECT pour ce champ, on le crée */
}else{ }else{
if( !isset($this->select[$field]) ) if( !isset($this->select[$field]) )
$this->select[$field] = [$func, $distinct]; $this->select[$field] = [$func, $distinct, $alias];
} }
@ -1002,19 +1006,26 @@
if( !$twoDimensions ) if( !$twoDimensions )
$formatted = [$formatted]; $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 // // {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 // // {2} On ajoute les colonnes des jointures //
foreach($this->joined as $j) 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 // // {3} On vérifie chaque clé, si c'est une colonne qui existe //
foreach($formatted as $i=>$entry) foreach($formatted as $i=>$entry)
// Pour chaque champ // Pour chaque champ
foreach($entry as $index=>$value) foreach($entry as $index=>$value){
// Si la colonne existe on applique le type // Si la colonne existe on applique le type
if( isset($existingColumns[$index]) ){ if( isset($existingColumns[$index]) ){
@ -1023,11 +1034,17 @@
$formatted[$i][$index] = intval( $value ); $formatted[$i][$index] = intval( $value );
elseif( $existingColumns[$index]['type'] == 'float' ) elseif( $existingColumns[$index]['type'] == 'float' )
$formatted[$i][$index] = floatval( $value ); $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 // 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]); unset($formatted[$i][$index]);
}
/* (3) On remet 1 dimension si 1 dimension à la base */ /* (3) On remet 1 dimension si 1 dimension à la base */
if( !$twoDimensions ) if( !$twoDimensions )

View File

@ -21,11 +21,6 @@
} }
/* CONSTRUIT LA REQUETE FORMATTEE "ORDER BY" AVEC UNE LISTE DE CHAMPS /* CONSTRUIT LA REQUETE FORMATTEE "ORDER BY" AVEC UNE LISTE DE CHAMPS
* *
* @tables<Array> Liste de champs : [table => fields] * @tables<Array> Liste de champs : [table => fields]
@ -37,12 +32,6 @@
return $tables; return $tables;
} }
/* CONSTRUIT LA REQUETE FORMATTEE "GROUP BY" AVEC UNE LISTE DE CHAMPS /* CONSTRUIT LA REQUETE FORMATTEE "GROUP BY" AVEC UNE LISTE DE CHAMPS
* *
* @tables<Array> Liste de champs : [table => fields] * @tables<Array> Liste de champs : [table => fields]
@ -55,10 +44,6 @@
} }
/* CONSTRUIT LA REQUETE FORMATTEE "FROM" AVEC UNE LISTE DE TABLES /* CONSTRUIT LA REQUETE FORMATTEE "FROM" AVEC UNE LISTE DE TABLES
* *
* @tables<Array> Liste de tables OU SQL PUR * @tables<Array> Liste de tables OU SQL PUR
@ -71,10 +56,6 @@
} }
/* CONSTRUIT LA REQUETE FORMATTEE "UPDATE" AVEC LA TABLE EN QUESTION /* CONSTRUIT LA REQUETE FORMATTEE "UPDATE" AVEC LA TABLE EN QUESTION
* *
* @table<String> Table en question * @table<String> Table en question
@ -87,10 +68,6 @@
} }
/* CONSTRUIT LA REQUETE FORMATTEE "DELETE" AVEC LA TABLE EN QUESTION /* CONSTRUIT LA REQUETE FORMATTEE "DELETE" AVEC LA TABLE EN QUESTION
* *
* @table<String> Table en question * @table<String> Table en question
@ -103,10 +80,6 @@
} }
/* CONSTRUIT LA REQUETE TEXTUELLE "IN" AVEC UNE LISTE DE TABLES /* CONSTRUIT LA REQUETE TEXTUELLE "IN" AVEC UNE LISTE DE TABLES
* *
* @field<Array> Tableau contenant [table, field] * @field<Array> Tableau contenant [table, field]
@ -140,13 +113,7 @@
} }
return $sql.")"; return $sql.")";
} } /* CONSTRUIT LA REQUETE TEXTUELLE "WHERE" AVEC UNE LISTE DE TABLES
/* CONSTRUIT LA REQUETE TEXTUELLE "WHERE" AVEC UNE LISTE DE TABLES
* *
* @field<Array> Tableau contenant [table, field] * @field<Array> Tableau contenant [table, field]
* @valeur<Array> Valeurs de la clause WHERE [valeur, opérateur] * @valeur<Array> Valeurs de la clause WHERE [valeur, opérateur]
@ -177,13 +144,7 @@
return $sql; return $sql;
} } /* CONSTRUIT LA REQUETE FORMATTEE "SET" AVEC UNE LISTE DE TABLES
/* CONSTRUIT LA REQUETE FORMATTEE "SET" AVEC UNE LISTE DE TABLES
* *
* @values<Array> Tableau de la forme [ field=>value, field2=>value2 ] * @values<Array> Tableau de la forme [ field=>value, field2=>value2 ]
* @bound<Arary> Tableau associatif contenant les variables "bindés" -> ajout des champs * @bound<Arary> Tableau associatif contenant les variables "bindés" -> ajout des champs
@ -213,13 +174,7 @@
} }
return $sql; return $sql;
} } /* CONSTRUIT LA REQUETE FORMATTEE "LIMIT" AVEC UN NOMBRE D'ENTREES
/* CONSTRUIT LA REQUETE FORMATTEE "LIMIT" AVEC UN NOMBRE D'ENTREES
* *
* @count<int> Nombre limite * @count<int> Nombre limite
* *
@ -240,18 +195,6 @@
return $sql; return $sql;
} }
/* CONSTRUIT LA REQUETE A PARTIR D'UNE REQUETTE FORMATTEE /* CONSTRUIT LA REQUETE A PARTIR D'UNE REQUETTE FORMATTEE
* *
* @request<Arary> Requête formattée * @request<Arary> Requête formattée
@ -275,7 +218,7 @@
case 'SELECT': case 'SELECT':
$sql .= "SELECT "; $sql .= "SELECT ";
$c = 0; $c = 0;
foreach($statements as $table=>$fields) foreach($statements as $table=>$fields){
foreach($fields as $field=>$select){ foreach($fields as $field=>$select){
/* (1) On construit le nom du champ */ /* (1) On construit le nom du champ */
@ -291,7 +234,11 @@
/* (4) On ajoute l'alias */ /* (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"; $fieldStr = "$fieldStr as agg_$field";
else else
$fieldStr = "$fieldStr"; $fieldStr = "$fieldStr";
@ -300,6 +247,7 @@
$c++; $c++;
} }
}
$sql .= "\n"; $sql .= "\n";
break; break;
@ -409,12 +357,6 @@
} }
/* [2] On retourne le résultat /* [2] On retourne le résultat
=========================================================*/ =========================================================*/
return $sql; return $sql;