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/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); } } diff --git a/tests/Base/DataTrait.php b/tests/Base/DataTrait.php index 6cfe970..f42b4ae 100644 --- a/tests/Base/DataTrait.php +++ b/tests/Base/DataTrait.php @@ -4,12 +4,12 @@ namespace Yiisoft\Data\Db\Tests\Base; +use DateTimeImmutable; use Yiisoft\Data\Db\QueryDataReader; use Yiisoft\Data\Reader\DataReaderInterface; 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; @@ -60,6 +60,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 +78,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(); } });