This commit is contained in:
2025-08-01 18:29:11 +03:00
parent 2f3dd81d0a
commit ccdcc3e047
10 changed files with 1226 additions and 51 deletions

View File

@@ -0,0 +1,158 @@
<?php
namespace goodboyalex\php_db_components_pack\classes;
use goodboyalex\php_components_pack\classes\Tuple;
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 = "`$this->ColumnName` $this->Operator :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"];
}
}