-
Notifications
You must be signed in to change notification settings - Fork 0
QueryHelper
Le QueryHelper est un adaptateur conçu pour assurer la transition entre l'ancien système de tableaux de configuration (extendQueryParams) et le nouveau QueryBuilder.
Il permet d'injecter dynamiquement des briques SQL (SELECT, JOIN, WHERE, etc.) provenant de scripts externes sans avoir à manipuler manuellement l'objet QueryBuilder dans chaque boucle.
Namespace : Magepattern\Component\Database\QueryBuilder
La méthode principale applyExtendParams() analyse la structure du tableau fourni, "aplatit" les éventuels niveaux d'imbrication hérités de l'ancien système, et appelle les méthodes correspondantes du QueryBuilder.
use Magepattern\Component\Database\QueryBuilder;
use Magepattern\Component\Database\QueryHelper;
// 1. Définition de la requête de base
$qb = (new QueryBuilder())
->select(['p.id_product', 'pc.name_p'])
->from('mc_catalog_product', 'p');
// 2. Récupération de paramètres dynamiques (ex: depuis un contrôleur ou un plugin)
$extra = [
'select' => ['p.price_p', 'img.name_img'],
'join' => [
[
'table' => 'mc_catalog_product_img',
'as' => 'img',
'condition' => 'p.id_product = img.id_product',
'type' => 'LEFT JOIN'
]
],
'where' => 'p.published_p = 1',
'order' => 'p.price_p DESC'
];
// 3. Application automatique
QueryHelper::applyExtendParams($qb, $extra);
// 4. Exécution
$sql = $qb->getSql();
$params = $qb->getParams();Le Helper est flexible et accepte plusieurs formats pour chaque clause :
| Clause | Formats acceptés |
|---|---|
| SELECT | string ("p.id") ou array (['id', 'name']). |
| JOIN | Tableaux avec table, as, condition (ou on). Supporte le type (LEFT, RIGHT). |
| WHERE | Chaîne brute ("active=1") ou tableau de conditions. Gère aussi la clé filter. |
| GROUP | string ("p.id_cat") ou array (['p.id_cat', 'p.brand']). |
| HAVING | string ("total > 5") ou tableau de conditions complexes. |
| ORDER | Chaîne simple ("price DESC") ou tableau de tris. |
| LIMIT | Entier simple (20) ou chaîne avec offset ("0, 20"). |
Ce scénario montre comment le QueryHelper permet à un script tiers d'influencer une requête sans en connaître la structure interne.
Dans le Model (La Base) :
use Magepattern\Component\Database\QueryBuilder;
use Magepattern\Component\Database\QueryHelper;
use Magepattern\Component\Database\Layer;
public function getProducts(array $newTableArray = [])
{
// 1. Initialisation de la requête de base (Minimaliste)
$qb = (new QueryBuilder())
->select(['p.id_product', 'pc.name_p'])
->from('mc_catalog_product', 'p')
->join('mc_catalog_product_content', 'pc', 'p.id_product = pc.id_product');
// 2. Injection MAGIQUE des paramètres externes
// Si $newTableArray contient des jointures ou des filtres, ils sont "empilés" ici
if (!empty($newTableArray['extendQueryParams'])) {
QueryHelper::applyExtendParams($qb, $newTableArray['extendQueryParams']);
}
// 3. Exécution finale
return Layer::getInstance()->fetchAll($qb->getSql(), $qb->getParams());
}Ce que le script externe (Controller) peut envoyer Le script appelant peut maintenant "piloter" la requête très finement via le tableau $newTableArray :
$params = [
'extendQueryParams' => [
'select' => 'img.name_img',
'join' => [[
'table' => 'mc_catalog_product_img',
'as' => 'img',
'condition' => 'p.id_product = img.id_product'
]],
'where' => 'img.default_img = 1',
'order' => 'p.price_p ASC'
]
];
$products = $model->getProducts($params);L'ajout de ces clauses permet de traiter des données agrégées directement via le Helper. C'est particulièrement utile pour les rapports ou les compteurs de produits par catégorie.
$params = [
'extendQueryParams' => [
'select' => 'COUNT(p.id_product) as total_products, cat.name_cat',
'join' => [[
'table' => 'mc_catalog_cat',
'as' => 'cat',
'on' => ['table' => 'p', 'key' => 'id_cat']
]],
'group' => 'cat.id_cat',
'having' => 'total_products > 0'
]
];
QueryHelper::applyExtendParams($qb, $params['extendQueryParams']);Cas d'usage avancé : L'empilement multiple (Multi-stacking) Dans une architecture modulaire, une même requête peut être enrichie par plusieurs sources indépendantes (Plugins, Services, Filtres). Le QueryHelper permet d'accumuler ces configurations sans conflits.
Scénario : Liste de produits enrichie par 3 modules Imaginez un catalogue où chaque module ajoute sa propre logique :
// 1. Initialisation par le Model
$qb = (new QueryBuilder())->select('p.id_product')->from('mc_catalog_product', 'p');
// 2. Simulation de configurations venant de sources différentes
$extensions = [
'Module_SEO' => ['select' => 'pc.seo_title', 'join' => [...]],
'Module_Promo' => ['where' => 'p.price_p < 50', 'order' => 'p.price_p ASC'],
'Filtres_User' => ['where' => 'p.id_cat = 12']
];
// 3. L'empilement dynamique
foreach ($extensions as $name => $config) {
// Chaque appel ajoute ses briques à l'objet $qb sans écraser les autres
QueryHelper::applyExtendParams($qb, $config);
}
// 4. Résultat : Une seule requête SQL optimisée contenant TOUTES les instructions
$data = Layer::getInstance()->fetchAll($qb->getSql(), $qb->getParams());