ORM: Gestion de l'INSERTion multiple

This commit is contained in:
xdrm-brackets 2016-07-23 15:46:47 +02:00
parent ace1211fd0
commit b983560744
2 changed files with 80 additions and 40 deletions

View File

@ -487,6 +487,8 @@
/* AJOUTE UNE ENTREE DANS LA TABLE /* AJOUTE UNE ENTREE DANS LA TABLE
* *
* @entry<Array> Tableau associatif de la forme (colonne => valeur) * @entry<Array> Tableau associatif de la forme (colonne => valeur)
* OU
* @entries<Array> Tableau de la forme ([entry1, entry2])
* *
* @return status<Boolean> Retourne si TRUE ou FALSE les entrées ont bien été supprimées * @return status<Boolean> Retourne si TRUE ou FALSE les entrées ont bien été supprimées
* *
@ -494,36 +496,52 @@
public function insert($entry){ public function insert($entry){
/* [0] On vérifie les paramètres /* [0] On vérifie les paramètres
=========================================================*/ =========================================================*/
/* (1) Si c'est pas un tableau, erreur */ /* (1) Si c'est pas un tableau avec au moins une entrée, erreur */
if( !is_array($entry) ) if( !is_array($entry) || count($entry) == 0 )
return false; return false;
// S'il n'y a qu'une entrée, on met au même format que s'il y en avait plusieurs
$firstIndex = array_keys($entry)[0];
if( !is_array($entry[$firstIndex]) )
$entry = [ $entry ];
/* (2) On retire les champ inconnus */ /* (2) On retire les champ inconnus */
$cleared = []; $cleared = [];
// Pour chaque entrée du tableau // Pour chaque entrée du tableau
foreach($entry as $field=>$value) foreach($entry as $i=>$set){
$cleared[$i] = [];
foreach($set as $field=>$value){
if( isset($this->schema['columns'][$field]) ) // Champ existe if( isset($this->schema['columns'][$field]) ) // Champ existe
$cleared[$field] = $value; $cleared[$i][$field] = $value;
}
}
/* (3) On vérifie les types des champs */ /* (3) On vérifie les types des champs */
foreach($cleared as $field=>$value){ foreach($cleared as $i=>$set){
foreach($set as $field=>$value){
$type = $this->schema['columns'][$field]['type']; $type = $this->schema['columns'][$field]['type'];
// {1} Si de type INT/FLOAT et pas numérique, on retire le champ // // {1} Si de type INT/FLOAT et pas numérique, on retire le champ //
if( in_array($type, ['int', 'float']) && !is_numeric($value) && $value != self::DEFAULT ) if( in_array($type, ['int', 'float']) && !is_numeric($value) && $value != self::DEFAULT )
unset($cleared[$field]); unset($cleared[$i][$field]);
// {2} Si de type TEXT/VARCHAR et pas string, on retire le champ // // {2} Si de type TEXT/VARCHAR et pas string, on retire le champ //
if( in_array($type, ['text', 'varchar']) && !is_string($value) && $value != self::DEFAULT ) if( in_array($type, ['text', 'varchar']) && !is_string($value) && $value != self::DEFAULT )
unset($cleared[$field]); unset($cleared[$i][$field]);
} }
/* (4) Si il manque des données, erreur */ /* (4) Si il manque des données, erreur */
if( count($cleared) != count($this->schema['columns']) ) if( count($cleared[$i]) != count($this->schema['columns']) )
return false; return false;
}
/* [1] On crée la requête /* [1] On crée la requête
=========================================================*/ =========================================================*/
@ -532,7 +550,7 @@
/* (2) Clause : table(col1, col2, ...) */ /* (2) Clause : table(col1, col2, ...) */
$c = 0; $c = 0;
foreach($cleared as $field=>$value){ foreach($this->schema['columns'] as $field=>$value){
if( $c > 0 ) $requestS .= ', '; if( $c > 0 ) $requestS .= ', ';
$requestS .= $field; $requestS .= $field;
@ -542,21 +560,32 @@
// Fin de clause // Fin de clause
$requestS .= ")\n"; $requestS .= ")\n";
/* (3) Clause : VALUES(val1, val2, ...) */ /* (3) Clause : VALUES(val1, val2, ...) */
$requestS .= 'VALUES('; $v = 0;
foreach($cleared as $i=>$set){
if( $v == 0 ) $requestS .= 'VALUES(';
else $requestS .= ",\n\t(";
$c = 0; $c = 0;
foreach($cleared as $field=>$value){ foreach($this->schema['columns'] as $field=>$column){
if( $c > 0 ) $requestS .= ', '; if( $c > 0 ) $requestS .= ', ';
if( $value == self::DEFAULT) $requestS .= 'DEFAULT'; // On insère directement les valeurs 'DEFAULT' // Si l'entrée est donnée
else $requestS .= ':insert_'.$field; if( isset($set[$field]) )
if( $set[$field] == self::DEFAULT ) $requestS .= 'DEFAULT'; // On insère directement les valeurs 'DEFAULT'
else $requestS .= ':insert_'.$field.'_'.$i;
else
$requestS .= 'DEFAULT';
$c++; $c++;
} }
// Fin de clause // Fin de clause
$requestS .= ")"; $requestS .= ")";
$v++;
}
@ -567,10 +596,10 @@
$binded = []; $binded = [];
/* (1) On bind les paramètres */ /* (1) On bind les paramètres */
foreach($cleared as $field=>$value) foreach($cleared as $i=>$set)
if( $value != self::DEFAULT ) foreach($this->schema['columns'] as $field=>$column)
$binded[':insert_'.$field] = $value; if( isset($set[$field]) && $set[$field] != self::DEFAULT )
$binded[':insert_'.$field.'_'.$i] = $set[$field];
/* [3] On exécute la requête et envoie le status /* [3] On exécute la requête et envoie le status

View File

@ -398,13 +398,24 @@
// With ORM // With ORM
$insert = Table::get('user') $insert = Table::get('user')
->insert([ ->insert([
[
'id_user' => Rows::DEFAULT, 'id_user' => Rows::DEFAULT,
'id_warehouse' => $id_warehouse, 'id_warehouse' => 7,
'code' => $code, 'code' => 'AA-AA-AA-AA',
'username' => $username, 'username' => 'AA',
'firstname' => $firstname, 'firstname' => 'AA',
'lastname' => $lastname, 'lastname' => 'AA',
'mail' => $mail, 'mail' => 'AA@AA.AA'
],
[
'id_user' => Rows::DEFAULT,
'id_warehouse' => 7,
'code' => 'BB-BB-BB-BB',
'username' => 'BB',
'firstname' => 'BB',
'lastname' => 'BB',
'mail' => 'BB@BB.BB'
]
]); ]);