From 4f18eeb2645ef73ef29f258f713cf31d4db048ec Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 23 Aug 2025 23:18:11 +0300 Subject: [PATCH 1/3] between and equals --- src/FilterHandler/BetweenFilterHandler.php | 15 ++++++++++++- src/FilterHandler/EqualsFilterHandler.php | 8 ++++++- tests/Base/DataTrait.php | 26 ++++++++++------------ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/FilterHandler/BetweenFilterHandler.php b/src/FilterHandler/BetweenFilterHandler.php index bbd7a6a..f3120ba 100644 --- a/src/FilterHandler/BetweenFilterHandler.php +++ b/src/FilterHandler/BetweenFilterHandler.php @@ -4,8 +4,10 @@ namespace Yiisoft\Data\Db\FilterHandler; +use DateTimeInterface; use Yiisoft\Data\Reader\Filter\Between; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\Expression\Value\DateTimeValue; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\Between as DbBetweenCondition; @@ -20,6 +22,17 @@ public function getCondition(FilterInterface $filter, Context $context): Conditi { /** @var Between $filter */ - return new DbBetweenCondition($filter->field, $filter->minValue, $filter->maxValue); + return new DbBetweenCondition( + $filter->field, + $this->prepareValue($filter->minValue), + $this->prepareValue($filter->maxValue), + ); + } + + private function prepareValue(bool|DateTimeInterface|float|int|string $value): mixed + { + return $value instanceof DateTimeInterface + ? new DateTimeValue($value) + : $value; } } diff --git a/src/FilterHandler/EqualsFilterHandler.php b/src/FilterHandler/EqualsFilterHandler.php index 5713ac2..7743c05 100644 --- a/src/FilterHandler/EqualsFilterHandler.php +++ b/src/FilterHandler/EqualsFilterHandler.php @@ -4,8 +4,10 @@ namespace Yiisoft\Data\Db\FilterHandler; +use DateTimeInterface; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\Expression\Value\DateTimeValue; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\Equals as DbEqualsCondition; @@ -20,6 +22,10 @@ public function getCondition(FilterInterface $filter, Context $context): Conditi { /** @var Equals $filter */ - return new DbEqualsCondition($filter->field, $filter->value); + $value = $filter->value instanceof DateTimeInterface + ? new DateTimeValue($filter->value) + : $filter->value; + + return new DbEqualsCondition($filter->field, $value); } } diff --git a/tests/Base/DataTrait.php b/tests/Base/DataTrait.php index 6cfe970..5c45b94 100644 --- a/tests/Base/DataTrait.php +++ b/tests/Base/DataTrait.php @@ -4,6 +4,7 @@ namespace Yiisoft\Data\Db\Tests\Base; +use DateTimeImmutable; use Yiisoft\Data\Db\QueryDataReader; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Tests\Common\FixtureTrait; @@ -60,6 +61,9 @@ protected function assertFixtures(array $expectedFixtureIndexes, array $actualFi unset($fixture['id']); $fixture['number'] = (int) $fixture['number']; $fixture['balance'] = (float) $fixture['balance']; + $fixture['born_at'] = $fixture['born_at'] === null + ? null + : new DateTimeImmutable($fixture['born_at']); $processedActualFixtures[$fixture['number'] - 1] = $fixture; } @@ -75,29 +79,23 @@ protected function populateDatabase(): void return; } + $columnBuilder = $db->getColumnBuilderClass(); $db ->createCommand() ->createTable( '{{%user}}', [ - 'id' => 'pk', - 'number' => 'integer NOT NULL', - 'email' => 'string(255) NOT NULL', - 'balance' => 'float DEFAULT 0.0 NOT NULL', - 'born_at' => 'date', + 'id' => $columnBuilder::primaryKey(), + 'number' => $columnBuilder::integer()->notNull(), + 'email' => $columnBuilder::string()->notNull(), + 'balance' => $columnBuilder::float()->defaultValue(0.0)->notNull(), + 'born_at' => $columnBuilder::datetimeWithTimezone(), ], ) ->execute(); - $db->transaction(static function (ConnectionInterface $database): void { - foreach (self::$fixtures as $fixture) { - if ($fixture['born_at'] !== null && $database->getDriverName() === 'oci') { - $fixture['born_at'] = new Expression( - "TO_DATE(:born_at, 'yyyy-mm-dd')", - [':born_at' => $fixture['born_at']], - ); - } - + $db->transaction(function (ConnectionInterface $database): void { + foreach ($this->getFixtures() as $fixture) { $database->createCommand()->insert('{{%user}}', $fixture)->execute(); } }); From 92542404d710c4e46c61af8f7ae1348f41b43a5a Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Sat, 23 Aug 2025 20:18:27 +0000 Subject: [PATCH 2/3] Apply fixes from StyleCI --- tests/Base/DataTrait.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Base/DataTrait.php b/tests/Base/DataTrait.php index 5c45b94..f42b4ae 100644 --- a/tests/Base/DataTrait.php +++ b/tests/Base/DataTrait.php @@ -10,7 +10,6 @@ use Yiisoft\Data\Tests\Common\FixtureTrait; use Yiisoft\Db\Connection\ConnectionInterface; use Yiisoft\Db\Driver\Pdo\PdoConnectionInterface; -use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Query\Query; use function is_object; From e80483ae49f1afce45f9aadb3e918af361c483c7 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 23 Aug 2025 23:57:05 +0300 Subject: [PATCH 3/3] fix --- src/FilterHandler/GreaterThanFilterHandler.php | 8 +++++++- src/FilterHandler/GreaterThanOrEqualFilterHandler.php | 8 +++++++- src/FilterHandler/LessThanFilterHandler.php | 8 +++++++- src/FilterHandler/LessThanOrEqualFilterHandler.php | 8 +++++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/FilterHandler/GreaterThanFilterHandler.php b/src/FilterHandler/GreaterThanFilterHandler.php index edcca06..2cf22e6 100644 --- a/src/FilterHandler/GreaterThanFilterHandler.php +++ b/src/FilterHandler/GreaterThanFilterHandler.php @@ -4,8 +4,10 @@ namespace Yiisoft\Data\Db\FilterHandler; +use DateTimeInterface; use Yiisoft\Data\Reader\Filter\GreaterThan; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\Expression\Value\DateTimeValue; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\GreaterThan as DbGreaterThan; @@ -20,6 +22,10 @@ public function getCondition(FilterInterface $filter, Context $context): Conditi { /** @var GreaterThan $filter */ - return new DbGreaterThan($filter->field, $filter->value); + $value = $filter->value instanceof DateTimeInterface + ? new DateTimeValue($filter->value) + : $filter->value; + + return new DbGreaterThan($filter->field, $value); } } diff --git a/src/FilterHandler/GreaterThanOrEqualFilterHandler.php b/src/FilterHandler/GreaterThanOrEqualFilterHandler.php index 1c03652..b62ab24 100644 --- a/src/FilterHandler/GreaterThanOrEqualFilterHandler.php +++ b/src/FilterHandler/GreaterThanOrEqualFilterHandler.php @@ -4,8 +4,10 @@ namespace Yiisoft\Data\Db\FilterHandler; +use DateTimeInterface; use Yiisoft\Data\Reader\Filter\GreaterThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\Expression\Value\DateTimeValue; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\GreaterThanOrEqual as DbGreaterThanOrEqual; @@ -20,6 +22,10 @@ public function getCondition(FilterInterface $filter, Context $context): Conditi { /** @var GreaterThanOrEqual $filter */ - return new DbGreaterThanOrEqual($filter->field, $filter->value); + $value = $filter->value instanceof DateTimeInterface + ? new DateTimeValue($filter->value) + : $filter->value; + + return new DbGreaterThanOrEqual($filter->field, $value); } } diff --git a/src/FilterHandler/LessThanFilterHandler.php b/src/FilterHandler/LessThanFilterHandler.php index 36e9127..bd6eadf 100644 --- a/src/FilterHandler/LessThanFilterHandler.php +++ b/src/FilterHandler/LessThanFilterHandler.php @@ -4,8 +4,10 @@ namespace Yiisoft\Data\Db\FilterHandler; +use DateTimeInterface; use Yiisoft\Data\Reader\Filter\LessThan; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\Expression\Value\DateTimeValue; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\LessThan as DbLessThan; @@ -20,6 +22,10 @@ public function getCondition(FilterInterface $filter, Context $context): Conditi { /** @var LessThan $filter */ - return new DbLessThan($filter->field, $filter->value); + $value = $filter->value instanceof DateTimeInterface + ? new DateTimeValue($filter->value) + : $filter->value; + + return new DbLessThan($filter->field, $value); } } diff --git a/src/FilterHandler/LessThanOrEqualFilterHandler.php b/src/FilterHandler/LessThanOrEqualFilterHandler.php index 465a54c..e503346 100644 --- a/src/FilterHandler/LessThanOrEqualFilterHandler.php +++ b/src/FilterHandler/LessThanOrEqualFilterHandler.php @@ -4,8 +4,10 @@ namespace Yiisoft\Data\Db\FilterHandler; +use DateTimeInterface; use Yiisoft\Data\Reader\Filter\LessThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\Expression\Value\DateTimeValue; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\LessThanOrEqual as DbLessThanOrEqual; @@ -20,6 +22,10 @@ public function getCondition(FilterInterface $filter, Context $context): Conditi { /** @var LessThanOrEqual $filter */ - return new DbLessThanOrEqual($filter->field, $filter->value); + $value = $filter->value instanceof DateTimeInterface + ? new DateTimeValue($filter->value) + : $filter->value; + + return new DbLessThanOrEqual($filter->field, $value); } }