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
8ccfe5a08f
commit
9dc24f4627
|
@ -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 */
|
||||||
|
|
|
@ -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());
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
Loading…
Reference in New Issue