2025-08-06 18:10:04 +03:00

177 lines
6.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace goodboyalex\php_db_components_pack\classes;
use goodboyalex\php_components_pack\classes\Tuple;
use goodboyalex\php_components_pack\extensions\StringExtension;
use goodboyalex\php_components_pack\interfaces\IArrayable;
use PHPUnit\Event\InvalidArgumentException;
/**
* Условие запроса выборки по условию.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
final class Condition implements IArrayable
{
/**
* Оператор логического И.
*/
public const string LOGIC_AND = 'AND';
/**
* Оператор логического ИЛИ.
*/
public const string LOGIC_OR = 'OR';
/**
* Оператор логического НЕ.
*/
public const string LOGIC_NOT = 'NOT';
/**
* Оператор логического ИСКЛЮЧАЮЩЕГО ИЛИ.
*/
public const string LOGIC_XOR = 'XOR';
/**
* Оператор логического НЕ И.
*/
public const string LOGIC_NAND = 'NAND';
/**
* Оператор логического НЕ ИЛИ.
*/
public const string LOGIC_NOR = 'NOR';
/**
* @var string $ColumnName Имя колонки.
*/
private string $ColumnName;
/**
* @var string $Operator Оператор.
*/
private string $Operator;
/**
* @var mixed $Value Значение.
*/
private mixed $Value;
/**
* Конструктор.
*
* @param string $columnName Имя колонки.
* @param string $operator Оператор.
* @param mixed $value Значение.
*/
public function __construct (string $columnName = "", string $operator = "=", mixed $value = null)
{
$this->ColumnName = $columnName;
$this->Operator = $operator;
$this->Value = $value;
}
/**
* Разбирает условие, заданное массивом и возвращает объект <code>Condition</code>.
*
* @param array $condition Условие, заданное в массиве.
*
* @return Condition Условие.
*/
public static function Parse (array $condition): Condition
{
// Проверка условия
if (count($condition) < 3)
// - если условие не содержит 3 элемента, то выбрасывается исключение
throw new InvalidArgumentException('Неверный формат условия / Unexpected condition format.');
// Разбор условия
[$column, $operator, $value] = $condition;
// Создание условия
return new Condition($column, $operator, $value);
}
/**
* Формирует условие.
*
* @param int $index Индекс замены параметров для защиты от SQL-инъекций.
*
* @return Tuple (string, array) Сформированное условие: SQL-запрос и параметры запроса.
*/
public function Get (int $index = 0): Tuple
{
// Начинаю формировать SQL
$sql = (!str_starts_with($this->ColumnName, "FUNC:"))
? "`$this->ColumnName`"
: StringExtension::Replace('FUNC:', '', $this->ColumnName);
// Добавляю оператор
$sql .= " $this->Operator ";
// Если это строковое значение и передаётся функция
if (is_string($this->Value) && str_starts_with($this->Value, "FUNC:")) {
// - то добавляю код SQL этой функции
$sql .= StringExtension::Replace('FUNC:', '', $this->ColumnName);
// - и устанавливаю пустые параметры запроса
$params = [];
}
else {
// - в противном случае, добавляю "муляжное" значение
$sql .= ":prop_$index";
// - а настоящее пропишем в параметрах запроса
$params = [":prop_$index" => $this->Value];
}
// Возвращение результата
return new Tuple($sql, $params);
}
/**
* @inheritDoc
*/
public function ToArray (): array
{
// Создаю массив
$result = [];
// Заполняю его
$result["type_class"] = Condition::class;
$result["ColumnName"] = $this->ColumnName;
$result["Operator"] = $this->Operator;
$result["Value"] = $this->Value;
// Возвращаю массив
return $result;
}
/**
* @inheritDoc
*/
public function FromArray (array $array): void
{
// Проверка массива
// - если массив содержит элемент "ColumnName"
if (isset($array["ColumnName"]))
// -- то присваиваю его значение
$this->ColumnName = $array["ColumnName"];
// - если массив содержит элемент "Operator"
if (isset($array["Operator"]))
// -- то присваиваю его значение
$this->Operator = $array["Operator"];
// - если массив содержит элемент "Value"
if (isset($array["Value"]))
// -- то присваиваю его значение
$this->Value = $array["Value"];
}
}