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 2ed990fe70
commit fd970b7de6
2 changed files with 36 additions and 77 deletions

View File

@ -248,11 +248,12 @@
* @field<String> Libellé du champ à afficher
* @func<CONST> Fonction d'aggrégation (ou NULL)
* @distinct<Boolean> Clause DISTINCT
* @alias<String> Alias du champ
*
* @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 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) )
unset($formatted[$i][$index]);
}
/* (3) On remet 1 dimension si 1 dimension à la base */
if( !$twoDimensions )

View File

@ -21,11 +21,6 @@
}
/* CONSTRUIT LA REQUETE FORMATTEE "ORDER BY" AVEC UNE LISTE DE CHAMPS
*
* @tables<Array> Liste de champs : [table => fields]
@ -37,12 +32,6 @@
return $tables;
}
/* CONSTRUIT LA REQUETE FORMATTEE "GROUP BY" AVEC UNE LISTE DE CHAMPS
*
* @tables<Array> Liste de champs : [table => fields]
@ -55,10 +44,6 @@
}
/* CONSTRUIT LA REQUETE FORMATTEE "FROM" AVEC UNE LISTE DE TABLES
*
* @tables<Array> Liste de tables OU SQL PUR
@ -71,10 +56,6 @@
}
/* CONSTRUIT LA REQUETE FORMATTEE "UPDATE" AVEC LA TABLE EN QUESTION
*
* @table<String> Table en question
@ -87,10 +68,6 @@
}
/* CONSTRUIT LA REQUETE FORMATTEE "DELETE" AVEC LA TABLE EN QUESTION
*
* @table<String> Table en question
@ -103,10 +80,6 @@
}
/* CONSTRUIT LA REQUETE TEXTUELLE "IN" AVEC UNE LISTE DE TABLES
*
* @field<Array> 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<Array> Tableau contenant [table, field]
* @valeur<Array> 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<Array> Tableau de la forme [ field=>value, field2=>value2 ]
* @bound<Arary> 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<int> Nombre limite
*
@ -240,18 +195,6 @@
return $sql;
}
/* CONSTRUIT LA REQUETE A PARTIR D'UNE REQUETTE FORMATTEE
*
* @request<Arary> 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;