This commit is contained in:
2025-08-06 18:10:04 +03:00
parent 7b42ba781c
commit eeea57209e
19 changed files with 636 additions and 16 deletions

View File

@@ -0,0 +1,38 @@
<?php
/**
* Отключаю несущественные инспекции (из-за Attribute)
*
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_db_components_pack\attributes;
use Attribute;
use Closure;
/**
* Атрибут указания методов сравнения значений поля в таблице базы данных.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
#[Attribute(flags: Attribute::TARGET_PROPERTY)]
final readonly class Compare
{
/**
* @var Closure|null $Function Метод сравнения значений.
*/
public ?Closure $Function;
/**
* Конструктор.
*
* @param callable|null $function Метод сравнения значений.
*/
public function __construct (?callable $function = null)
{
$this->Function = $function;
}
}

View File

@@ -31,22 +31,15 @@
*/
public ?Closure $ConvertFromDB;
/**
* @var Closure|null Метод сравнения типов.
*/
public ?Closure $Compare;
/**
* Конструктор.
*
* @param callable|null $fromType Метод конвертации из типа для заполнения таблицы базы данных.
* @param callable|null $toType Метод конвертации в тип для заполнения таблицы базы данных.
* @param callable|null $compare Метод сравнения типов.
*/
public function __construct (?callable $fromType = null, ?callable $toType = null, ?callable $compare = null)
public function __construct (?callable $fromType = null, ?callable $toType = null)
{
$this->ConvertToDB = $fromType;
$this->ConvertFromDB = $toType;
$this->Compare = $compare;
}
}

View File

@@ -3,6 +3,7 @@
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;
@@ -106,11 +107,29 @@
*/
public function Get (int $index = 0): Tuple
{
// Формирование условия SQL
$sql = "`$this->ColumnName` $this->Operator :prop_$index";
// Начинаю формировать SQL
$sql = (!str_starts_with($this->ColumnName, "FUNC:"))
? "`$this->ColumnName`"
: StringExtension::Replace('FUNC:', '', $this->ColumnName);
// Формирование параметров запроса
$params = [":prop_$index" => $this->Value];
// Добавляю оператор
$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);

View File

@@ -2,6 +2,7 @@
/**
* @noinspection SqlNoDataSourceInspection
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_db_components_pack\traits\Database;
@@ -11,6 +12,7 @@
use goodboyalex\php_components_pack\classes\Tuple;
use goodboyalex\php_db_components_pack\attributes\AutoIncrement;
use goodboyalex\php_db_components_pack\attributes\Check;
use goodboyalex\php_db_components_pack\attributes\Compare;
use goodboyalex\php_db_components_pack\attributes\ConvertToDB;
use goodboyalex\php_db_components_pack\attributes\DataType;
use goodboyalex\php_db_components_pack\attributes\DefaultValue;
@@ -129,7 +131,16 @@
// - получаю функцию конвертации и сравнения
$converterToDB = $convertAttr?->ConvertToDB;
$converterFromDB = $convertAttr?->ConvertFromDB;
$compareFunc = $convertAttr?->Compare;
/**
* Сравнение значений.
*
* @var Compare|null $compareAttr Атрибут сравнения значений.
*/
$compareAttr = self::FindAttribute($attributes, Compare::class);
// - получаю функцию сравнения
$compareFunc = $compareAttr?->Function;
// - получаем свойства столбца
/**