Skip to content
Gérits Aurélien edited this page Feb 20, 2026 · 2 revisions

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

Fonctionnement

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.

Exemple d'utilisation

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();

Formats supportés

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").

Exemple : Extension dynamique de requête

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);

Utilisation de GROUP BY & HAVING

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());

Clone this wiki locally