177 lines
6.4 KiB
PHP
177 lines
6.4 KiB
PHP
<?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"];
|
||
}
|
||
} |