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 8ccfe5a08f
commit 9dc24f4627
2 changed files with 76 additions and 71 deletions

View File

@ -412,41 +412,38 @@
if( $c == 0 ) $requestS .= 'WHERE ';
else $requestS .= 'AND ';
// {1} Clause SELECT interne //
$requestS .= $this->schema['table'].'.'.$localField." = (\n\t";
// {1} On inclut la requête de la jointure //
$requestS .= $this->schema['table'].'.'.$localField." in (\n\t";
// Jointure du SELECT, champ joint lié au champ local
$requestS .= SQLBuilder::SELECT([
$rows->schema['table'] => [ $this->schema['columns'][$localField]['references'][1] ]
])."\n";
// {2} On récupère la requête //
$RowsFetched = $rows->fetch(false);
// {3} On ajoute la requête //
$requestS .= implode("\n\t", explode("\n", $RowsFetched['request']));
// {2} Clause FROM interne //
$requestS .= "\t".SQLBuilder::FROM([$this->schema['columns'][$localField]['references'][0]])."\n";
// {4} On bind les params de la requête //
$binded = array_merge($binded, $RowsFetched['binded']);
// {3} Clause WHERE/AND interne //
$c2 = 0;
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";
// {5} On précise qu'on veut un seul résultat //
$requestS .= ")\n";
$c2++;
}
$requestS .= "\tLIMIT 1)\n";
$c++;
}
/* [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 */
$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 */
$updated = $request->execute($binded);
@ -624,40 +621,38 @@
if( $c == 0 ) $requestS .= 'WHERE ';
else $requestS .= 'AND ';
// {1} Clause SELECT interne //
$requestS .= $this->schema['table'].'.'.$localField." = (\n\t";
// {1} On inclut la requête de la jointure //
$requestS .= $this->schema['table'].'.'.$localField." in (\n\t";
// Jointure du SELECT, champ joint lié au champ local
$requestS .= SQLBuilder::SELECT([
$rows->schema['table'] => [ $this->schema['columns'][$localField]['references'][1] ]
])."\n";
// {2} On récupère la requête //
$RowsFetched = $rows->fetch(false);
// {3} On ajoute la requête //
$requestS .= implode("\n\t", explode("\n", $RowsFetched['request']));
// {2} Clause FROM interne //
$requestS .= "\t".SQLBuilder::FROM([$this->schema['columns'][$localField]['references'][0]])."\n";
// {4} On bind les params de la requête //
$binded = array_merge($binded, $RowsFetched['binded']);
// {3} Clause WHERE/AND interne //
$c2 = 0;
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";
// {5} On précise qu'on veut un seul résultat //
$requestS .= ")\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 */
$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 */
$deleted = $request->execute($binded);
@ -673,19 +668,14 @@
/* 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<mixed> Valeur du champ sélectionné (si 1 seul champ)
* @return ERROR<FALSE> Retourne FALSE si rien n'est trouvé
*
*/
public function fetch($unique=null){
/* [0] Initialisation des paramètres
=========================================================*/
$unique = !is_bool($unique) ? $this->unique : $unique;
public function fetch($execute=true){
/* [1] On rédige la clause SELECT
=========================================================*/
/* (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.';');
/* [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 */
$request->execute($binded);
/* (2) Si unique */
if( $unique )
if( $this->unique )
return $this->format( $request->fetch() );
/* (3) Si tout */

View File

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