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:
parent
1a6900ce01
commit
f078dde920
|
@ -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 */
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
||||
?>
|
||||
|
|
Loading…
Reference in New Issue