ORM: Gestion de la clause 'LIMIT 1' quand on spécifie ->unique() pour 'edit' et 'delete' + gestion de l'inclusion complète de la requête des jointures

This commit is contained in:
xdrm-brackets 2016-07-24 15:24:54 +02:00
parent 1a6900ce01
commit f078dde920
2 changed files with 76 additions and 71 deletions

View File

@ -412,41 +412,38 @@
if( $c == 0 ) $requestS .= 'WHERE '; if( $c == 0 ) $requestS .= 'WHERE ';
else $requestS .= 'AND '; else $requestS .= 'AND ';
// {1} Clause SELECT interne // // {1} On inclut la requête de la jointure //
$requestS .= $this->schema['table'].'.'.$localField." = (\n\t"; $requestS .= $this->schema['table'].'.'.$localField." in (\n\t";
// Jointure du SELECT, champ joint lié au champ local // {2} On récupère la requête //
$requestS .= SQLBuilder::SELECT([ $RowsFetched = $rows->fetch(false);
$rows->schema['table'] => [ $this->schema['columns'][$localField]['references'][1] ]
])."\n";
// {3} On ajoute la requête //
$requestS .= implode("\n\t", explode("\n", $RowsFetched['request']));
// {2} Clause FROM interne // // {4} On bind les params de la requête //
$requestS .= "\t".SQLBuilder::FROM([$this->schema['columns'][$localField]['references'][0]])."\n"; $binded = array_merge($binded, $RowsFetched['binded']);
// {3} Clause WHERE/AND interne // // {5} On précise qu'on veut un seul résultat //
$c2 = 0; $requestS .= ")\n";
foreach($rows->where as $field=>$conditions)
foreach($conditions as $cdt=>$value){
if( $value[1] == self::COND_IN ) // Si condition de type IN
$requestS .= "\t".SQLBuilder::IN([$rows->schema['table'], $field], $value[0], $c2, $binded)."\n";
else // Sinon
$requestS .= "\t".SQLBuilder::WHERE([$rows->schema['table'], $field], $value, $c2, $binded)."\n";
$c2++; $c++;
}
$requestS .= "\tLIMIT 1)\n";
} }
/* [4] On prépare la requête /* [4] Clause LIMIT
=========================================================*/
if( $this->unique )
$requestS .= "LIMIT 1";
/* [5] On prépare la requête
=========================================================*/ =========================================================*/
/* (0) On prépare la requête */ /* (0) On prépare la requête */
$request = Database::getPDO()->prepare($requestS.';'); $request = Database::getPDO()->prepare($requestS.';');
/* [5] On exécute la requête et retourne le résultat /* [6] On exécute la requête et retourne le résultat
=========================================================*/ =========================================================*/
/* (1) On exécute la requête */ /* (1) On exécute la requête */
$updated = $request->execute($binded); $updated = $request->execute($binded);
@ -624,40 +621,38 @@
if( $c == 0 ) $requestS .= 'WHERE '; if( $c == 0 ) $requestS .= 'WHERE ';
else $requestS .= 'AND '; else $requestS .= 'AND ';
// {1} Clause SELECT interne // // {1} On inclut la requête de la jointure //
$requestS .= $this->schema['table'].'.'.$localField." = (\n\t"; $requestS .= $this->schema['table'].'.'.$localField." in (\n\t";
// Jointure du SELECT, champ joint lié au champ local // {2} On récupère la requête //
$requestS .= SQLBuilder::SELECT([ $RowsFetched = $rows->fetch(false);
$rows->schema['table'] => [ $this->schema['columns'][$localField]['references'][1] ]
])."\n";
// {3} On ajoute la requête //
$requestS .= implode("\n\t", explode("\n", $RowsFetched['request']));
// {2} Clause FROM interne // // {4} On bind les params de la requête //
$requestS .= "\t".SQLBuilder::FROM([$this->schema['columns'][$localField]['references'][0]])."\n"; $binded = array_merge($binded, $RowsFetched['binded']);
// {3} Clause WHERE/AND interne // // {5} On précise qu'on veut un seul résultat //
$c2 = 0; $requestS .= ")\n";
foreach($rows->where as $field=>$conditions)
foreach($conditions as $cdt=>$value){
if( $value[1] == self::COND_IN ) // Si condition de type IN
$requestS .= "\t".SQLBuilder::IN([$rows->schema['table'], $field], $value[0], $c2, $binded)."\n";
else // Sinon
$requestS .= "\t".SQLBuilder::WHERE([$rows->schema['table'], $field], $value, $c2, $binded)."\n";
$c2++; $c++;
} }
$requestS .= "\tLIMIT 1)\n";
}
/* [3] On prépare la requête /* [3] Clause LIMIT
=========================================================*/
if( $this->unique )
$requestS .= "LIMIT 1";
/* [4] On prépare la requête
=========================================================*/ =========================================================*/
/* (0) On prépare la requête */ /* (0) On prépare la requête */
$request = Database::getPDO()->prepare($requestS.';'); $request = Database::getPDO()->prepare($requestS.';');
/* [4] On exécute la requête et retourne le résultat /* [5] On exécute la requête et retourne le résultat
=========================================================*/ =========================================================*/
/* (1) On exécute la requête */ /* (1) On exécute la requête */
$deleted = $request->execute($binded); $deleted = $request->execute($binded);
@ -673,19 +668,14 @@
/* RETOURNE LES DONNEES / NULL si une erreur survient /* RETOURNE LES DONNEES / NULL si une erreur survient
* *
* @unique<Boolean> VRAI si on veut un seul résultat (itérateur) * @execute<Boolean> VRAI si on veut exécuter la requête, sinon renvoie [requete, bindedParams]
* *
* @return data<Array> Tableau contenant les champs sélectionnés * @return data<Array> Tableau contenant les champs sélectionnés
* @return data<mixed> Valeur du champ sélectionné (si 1 seul champ) * @return data<mixed> Valeur du champ sélectionné (si 1 seul champ)
* @return ERROR<FALSE> Retourne FALSE si rien n'est trouvé * @return ERROR<FALSE> Retourne FALSE si rien n'est trouvé
* *
*/ */
public function fetch($unique=null){ public function fetch($execute=true){
/* [0] Initialisation des paramètres
=========================================================*/
$unique = !is_bool($unique) ? $this->unique : $unique;
/* [1] On rédige la clause SELECT /* [1] On rédige la clause SELECT
=========================================================*/ =========================================================*/
/* (1) On formatte les données */ /* (1) On formatte les données */
@ -748,19 +738,31 @@
} }
/* [6] On exécute la requête
/* [6] Clause LIMIT
=========================================================*/ =========================================================*/
/* (0) On prépare la requête */ if( $this->unique )
$requestS .= "LIMIT 1";
/* [7] On exécute la requête
=========================================================*/
/* (1) Si on veut pas exécuter on renvoie la requête + bindedParams */
if( !$execute )
return [ 'request' => $requestS, 'binded' => $binded];
/* (2) On prépare la requête */
$request = Database::getPDO()->prepare($requestS.';'); $request = Database::getPDO()->prepare($requestS.';');
/* [7] On exécute la requête et retourne le résultat
/* [8] On exécute la requête et retourne le résultat
=========================================================*/ =========================================================*/
/* (1) On exécute la requête */ /* (1) On exécute la requête */
$request->execute($binded); $request->execute($binded);
/* (2) Si unique */ /* (2) Si unique */
if( $unique ) if( $this->unique )
return $this->format( $request->fetch() ); return $this->format( $request->fetch() );
/* (3) Si tout */ /* (3) Si tout */

View File

@ -418,32 +418,35 @@
=========================================================*/ =========================================================*/
// $warehouse = // $warehouse =
// Table::get('warehouse') // Access to table 'warehouse' // Table::get('warehouse') // Access to table 'warehouse'
// ->whereName('stef-montauban'); // condition : name = 'my-warehouse' // ->whereName(['%stef%', Rows::COND_LIKE]) // condition : name = 'my-warehouse'
// ->select('id_warehouse');
// //
// //
// $myUser = // $myUser =
// Table::get('user') // Access to table 'user' // Table::get('user') // Access to table 'user'
// ->whereId([100, Rows::COND_INF]) // PRIMARY KEY (other condition on same field) // ->whereId([[7,91], Rows::COND_IN]) // PRIMARY KEY (other condition on same field)
// ->whereId([[1,4,6,9], Rows::COND_IN]) // PRIMARY KEY (other condition on same field) // ->whereUsername(['%', Rows::COND_LIKE]) // Dynamic getter 'getByMySuperColumn' -> 'my_super_column'
// ->whereUsername(['n%', Rows::COND_LIKE]) // Dynamic getter 'getByMySuperColumn' -> 'my_super_column'
// ->select(['mail', 'username', 'firstname']) // Select clause // ->select(['mail', 'username', 'firstname']) // Select clause
// ->select('id_user') // Select clause (added) // ->select('id_user') // Select clause (added)
// ->join('id_warehouse', $warehouse) // joins warehouse (with name 'my-warehouse') to column 'id_warehouse' // ->join('id_warehouse', $warehouse) // joins warehouse (with name 'my-warehouse') to column 'id_warehouse'
// // ->unique() // unique result // ->unique() // unique result
// //
// ->delete(); // ->delete();
// var_dump($myUser);
// $module = Table::get('module')
// ->select('id_module');
// //
$module = Table::get('module') // $warehouse = Table::get('warehouse')
->whereName([ $_SESSION['WAREHOUSE']['modules'], Rows::COND_IN ]); // ->whereId(7);
//
$chip = Table::get('chip') // $module_merge = Table::get('module_merge')
->select('*'); // ->join('id_module', $module)
// ->join('id_warehouse', $warehouse);
$module_merge = Table::get('module_merge') //
->join('id_module', $module); // var_dump($module_merge->fetch(false));
// ->join('id_chip', $chip);
var_dump($module_merge->fetch());
?> ?>