diff --git a/manager/ORM/Rows.php b/manager/ORM/Rows.php index 6ab872e..b644fe3 100644 --- a/manager/ORM/Rows.php +++ b/manager/ORM/Rows.php @@ -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++; - } - - $requestS .= "\tLIMIT 1)\n"; + $c++; } - /* [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 VRAI si on veut un seul résultat (itérateur) + * @execute VRAI si on veut exécuter la requête, sinon renvoie [requete, bindedParams] * * @return data Tableau contenant les champs sélectionnés * @return data Valeur du champ sélectionné (si 1 seul champ) * @return ERROR 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 */ diff --git a/test/automate.php b/test/automate.php index 28b41df..76bdec3 100755 --- a/test/automate.php +++ b/test/automate.php @@ -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)); ?>