Skip to content

Criteria and CriteriaCompo Classes

The Criteria and CriteriaCompo classes provide a fluent, object-oriented interface for building complex database queries. These classes abstract SQL WHERE clauses, allowing developers to construct dynamic queries safely and readably.

Class Overview

Criteria Class

The Criteria class represents a single condition in a WHERE clause:

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 {}
}

Basic Usage

Simple Criteria

use Xoops\Database\Criteria;
use Xoops\Database\CriteriaCompo;

// Single condition
$criteria = new Criteria('status', 'active');
// Renders: `status` = 'active'

Different Operators

// Equality (default)
$criteria = new Criteria('status', 'active', '=');

// Not equal
$criteria = new Criteria('status', 'active', '<>');

// Greater than
$criteria = new Criteria('age', 18, '>');

// Less than or equal
$criteria = new Criteria('age', 65, '<=');

// LIKE (for pattern matching)
$criteria = new Criteria('email', '%@example.com', 'LIKE');

// IN (for multiple values)
$criteria = new Criteria('status', ['active', 'pending', 'review'], 'IN');

Building Complex Queries

AND Logic (Default)

$criteria = new CriteriaCompo();
$criteria->add(new Criteria('status', 'active'));
$criteria->add(new Criteria('age', 18, '>='));
$criteria->add(new Criteria('verified', 1));
// Renders: `status` = 'active' AND `age` >= 18 AND `verified` = 1

OR Logic

$criteria = new CriteriaCompo('OR');
$criteria->add(new Criteria('role', 'admin'));
$criteria->add(new Criteria('role', 'moderator'));
$criteria->add(new Criteria('role', 'editor'));

Integration with Repository Pattern

Repository Example

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

Safety and Security

Automatic Escaping

The Criteria class automatically escapes values to prevent SQL injection:

// Safe - value is automatically escaped
$userInput = "'; DROP TABLE users; --";
$criteria = new Criteria('username', $userInput);
// Safely renders: `username` = '\''; DROP TABLE users; --'

API Reference

Criteria Methods

Method Description Return
__construct() Initialize a criteria condition void
render($prefix = '') Render to SQL WHERE clause segment string
getColumn() Get the column name string
getValue() Get the comparison value mixed
getOperator() Get the comparison operator string

CriteriaCompo Methods

Method Description Return
__construct($logic = 'AND') Initialize composite criteria void
add($criteria, $logic = null) Add criteria or nested composite void
render($prefix = '') Render to complete WHERE clause string
count() Get number of criteria int
clear() Remove all criteria void

Version Information

  • Introduced: XOOPS 2.5.0
  • Last Updated: XOOPS 2026
  • Compatibility: PHP 7.4+