Construction de requêtes customisées Les requêtes customisées passent par l'utilisation de plusieurs utilitaires différents permettant de construire via des méthodes PHP une requête SQL différente des méthodes classiques CRUD.
MysqlQueryBuilder L'utilitaire principale, le constructeur de requête EagleCore\Database\Default\QueryBuilder\MysqlQueryBuilder
<?php
use EagleCore\Database\Default\QueryBuilder\MysqlQueryBuilder;
MysqlQueryBuilder::createFrom(modelClass: YourModel::class);
reset
remet à 0 les éléments internes du constructeur
prepareRequest
prépare la requête dans l'instance de PDO fournie
as
défini l'alias dans la requête
getRealSql
fourni le SQL interne sans modification
getSql
fourni le SQL généré
getBaseModel
fourni le model lié au constructeur
getBindValues
fourni une liste de class gestionnaires de bind
joinBuilder
permet de joindre le constructeur fourni au constructeur actuel (utilisé pour l'imbrication de requête)
staticRequest
permet d'écrire manuellement une requête SQL
Les fonctions suivantes permettent de construire la requête SQL partie par partie. Les commentaires associés décrivent plus en détails chacun des paramètres.
Select La méthode select
permet de définir les éléments à sélectionner dans la requête. Elle attend des noms d'attribut ou des fonctions SQL encapsulées dans MysqlFunction
. Si aucun paramètre n'est fourni alors SELECT *
Cet exemple montre uniquement les possibilités
$builder->select("username",MysqlFunction::COUNT(numberGetter: "`{price}`"));
Insert La méthode insert
permet de définir une requête d'insertion. Elle attend un tableau indicé par les noms d'attributs de class associé aux colonnes avec comme valeur, les données à insérer.
Les données à insérer peuvent être sous la forme : brute
, MysqlFunction
ou MysqlQueryBuilder
Cet exemple montre uniquement les possibilités
$builder->insert(insertConfig: [
"username" => "yahvya",
"github" => "https://github.com/yahvya",
"fullname" => MysqlFunction::UPPER("{username}"),
"queryResult" => MysqlQueryBuilder::createFrom(modelClass: YourModel::class)
->select()
->limit(count: 1)
]);
Update La méthode update
permet de définir une requête de mise à jour. Elle attend un tableau indicé par les noms d'attributs de class associé aux colonnes avec comme valeur, les données à mettre à jour.
Les données à mettre à jour peuvent être sous la forme : brute
, MysqlFunction
ou MysqlQueryBuilder
Cet exemple montre uniquement les possibilités
$builder->update(insertConfig: [
"username" => "yahvya",
"github" => "https://github.com/yahvya",
"fullname" => MysqlFunction::UPPER("{username}"),
"queryResult" => MysqlQueryBuilder::createFrom(modelClass: YourModel::class)
->select()
->limit(count: 1)
]);
Delete
$builder->delete();
Where
$builder->select()->where(); # équivaux à SELECT * from ... WHERE
Cond La fonction cond
permet de paire avec where
, de définir les conditions where via un ensemble de méthodes. Elle attend MysqlCondition
la classe de gestion des conditions ou MysqlCondSeparator
permettant de séparer les conditions, créer des groupes ...
Cet exemple montre uniquement les possibilités
$builder
->select()
->where()
->cond(
new MysqlCondition(condGetter: "username",comparator: MysqlComparator::EQUAL(),conditionValue: "yahvya"),
MysqlCondSeparator::AND(),
new MysqlCondition(condGetter: "email",comparator: MysqlComparator::EQUAL(),conditionValue: "eagle.framework@github.com"),
);
Order By La fonction orderBy
permet d'ajouter la clause orderBy
à la requête. Elle prend en paramètre un tableau contenant une liste au format [nom d'attribut, "ASC|DESC]
$builder
->select()
->orderBy(["price","ASC"],["id","DESC"]);
Group By La fonction groupBy
permet d'ajouter la clause GROUP BY
à la requête. Elle prend en paramètre la liste des noms d'attributs de classe.
Cet exemple montre uniquement les possibilités
$builder
->select(MysqlFunction::COUNT(numberGetter: "{price}"))
->groupBy("price","id");
Limit La fonction limit
permet d'ajouter la clause LIMIT
à la requête. Elle prend en paramètre le nombre d'éléments et optionnellement l'offset.
$builder
->select()
->limit(count: 1);
$builder
->select()
->limit(count: 15,offset: 30);
MysqlComparator Cette class sert à ajouter un symbole de comparaison. Elle contient par défaut un panel de fonctions représentant différents modes de comparaison. Fiez-vous aux commentaires de ces fonctions pour l'utilisation.
Certains comparateurs attendent un type de données implicites, ex: IN()
attend que la donnée fournie derrière soit un tableau contenant les valeurs à vérifier. Les commentaires définissent les requis
Veuillez utiliser le plus possible les fonctions déjà définies et éviter d'utiliser le constructeur.
Focus sur la méthode spéciale REQUEST_COMPARATOR
Cette méthode permet de comparer une valeur avec le résultat d'une requête ex: WHERE ID = (SELECT id from table)
.
Elle prend en paramètre une chaine comparator spéciale, car permettant de choisir l'emplacement de la requête.
Pour une requête du style SELECT * FROM table_1 where id = IN(SELECT id from table_2 LIMIT 4)
$tableOneBuilder = MysqlQueryBuilder::createFrom(modelClass: TableOneModel::class);
$tableTwoBuilder = MysqlQueryBuilder::createFrom(modelClass: TableTwoModel::class);
$tableTwoBuilder
->select("id")
->limit(count: 4);
$tableOneBuilder
->select();
->where()
->cond(new MysqlCondition(
condGetter: "id",
comparator: MysqlComparator::REQUEST_COMPARATOR(comparator: "IN({request})",queryBuilder: $tableTwoBuilder),
conditionValue: $tableTwoBuilder
));
MysqlCondition Cette class permet de définir une condition sql basé sur trois paramètres, condGetter
le nom d'un attribut ou MysqlFunction
, comparator
le comparateur, conditionValue
la valeur requise par le comparateur utilisé
MysqlCondSeparator Cette class permet d'ajouter des bouts de chaine SQL, notamment des mots clés de séparation. Elle peut être donc être utilisé pour créer des groupes de condition en ajoutant ( et ) via GROUP_START et GROUP_END ou des mots clés customisés
$builder
->select()
->where()
->cond(
MysqlCondSeparator::GROUP_START(),
new MysqlCondition(...),
new MysqlCondSeparator::AND(),
new MysqlCondition(...),
MysqlCondSeparator::GROUP_END()
new MysqlCondSeparator::OR(),
new MysqlCondition(...)
);
12 août 2025