Aller au contenu

Classes Criteria et CriteriaCompo

Les classes Criteria et CriteriaCompo fournissent une interface fluide orientée objet pour construire des requêtes base de données complexes. Ces classes abstraient les clauses SQL WHERE, permettant aux développeurs de construire des requêtes dynamiques de manière sécurisée et lisible.

La classe Criteria représente une condition unique dans une clause WHERE :

namespace Xoops\Database;
class Criteria
{
protected $column;
protected $operator;
protected $value;
protected $function;
public function __construct(
string $column,
mixed $value = null,
string $operator = '=',
string $function = ''
) {}
public function render(string $prefix = ''): string {}
}
use Xoops\Database\Criteria;
use Xoops\Database\CriteriaCompo;
// Condition unique
$criteria = new Criteria('status', 'active');
// Rendu : `status` = 'active'
// Égalité (défaut)
$criteria = new Criteria('status', 'active', '=');
// Pas égal
$criteria = new Criteria('status', 'active', '<>');
// Plus grand que
$criteria = new Criteria('age', 18, '>');
// Moins ou égal
$criteria = new Criteria('age', 65, '<=');
// LIKE (pour correspondance motif)
$criteria = new Criteria('email', '%@example.com', 'LIKE');
// IN (pour valeurs multiples)
$criteria = new Criteria('status', ['active', 'pending', 'review'], 'IN');
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('status', 'active'));
$criteria->add(new Criteria('age', 18, '>='));
$criteria->add(new Criteria('verified', 1));
// Rendu : `status` = 'active' AND `age` >= 18 AND `verified` = 1
$criteria = new CriteriaCompo('OR');
$criteria->add(new Criteria('role', 'admin'));
$criteria->add(new Criteria('role', 'moderator'));
$criteria->add(new Criteria('role', 'editor'));
namespace MyModule\Repository;
use Xoops\Database\XoopsDatabase;
use Xoops\Database\Criteria;
use Xoops\Database\CriteriaCompo;
class UserRepository
{
private $db;
private $table = 'users';
public function __construct(XoopsDatabase $db)
{
$this->db = $db;
}
public function findByCriteria(CriteriaCompo $criteria): array
{
$sql = "SELECT * FROM {$this->table}";
if ($criteria->count() > 0) {
$sql .= " WHERE " . $criteria->render();
}
$result = $this->db->query($sql);
$users = [];
while ($row = $this->db->fetchArray($result)) {
$users[] = new User($row);
}
return $users;
}
}

La classe Criteria échappe automatiquement les valeurs pour prévenir l’injection SQL :

// Sécurisé - la valeur est automatiquement échappée
$userInput = "'; DROP TABLE users; --";
$criteria = new Criteria('username', $userInput);
// Rendu sécurisé : `username` = '\''; DROP TABLE users; --'
MéthodeDescriptionRetour
__construct()Initialiser une condition criteriavoid
render($prefix = '')Rendu en segment clause WHERE SQLstring
getColumn()Obtenir le nom de colonnestring
getValue()Obtenir la valeur de comparaisonmixed
getOperator()Obtenir l’opérateur de comparaisonstring
MéthodeDescriptionRetour
__construct($logic = 'AND')Initialiser criteria compositesvoid
add($criteria, $logic = null)Ajouter criteria ou composite imbriquévoid
render($prefix = '')Rendu en clause WHERE complètestring
count()Obtenir le nombre de criteriaint
clear()Supprimer tous les criteriavoid
  • XoopsDatabase - Classe de base de données
  • ../../03-Module-Development/Patterns/Repository-Pattern - Modèle repository dans XOOPS
  • ../../03-Module-Development/Patterns/Service-Layer-Pattern - Modèle service layer
  • Introduit : XOOPS 2.5.0
  • Dernière mise à jour : XOOPS 4.0
  • Compatibilité : PHP 7.4+