generated from yiisoft/package-template
-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
CompareFilter.php
90 lines (71 loc) · 2.13 KB
/
CompareFilter.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
declare(strict_types=1);
namespace Yiisoft\Data\Db\Filter;
use DateTimeInterface;
use Yiisoft\Data\Db\ColumnFormatterTrait;
use Yiisoft\Data\Reader\FilterInterface;
use Yiisoft\Db\Expression\ExpressionInterface;
abstract class CompareFilter implements FilterInterface
{
use ColumnFormatterTrait;
public static string $mainDateTimeFormat = 'Y-m-d H:i:s';
protected mixed $value;
protected bool $ignoreNull = false;
protected ?string $dateTimeFormat = null;
/**
* @param ExpressionInterface|string $column
* @param mixed $value
* @param string|null $table
*/
public function __construct(string|ExpressionInterface $column, mixed $value, ?string $table = null)
{
$this->value = $value;
$this->setColumn($column, $table);
}
public function withIgnoreNull(bool $ignoreNull = true): static
{
$new = clone $this;
$new->ignoreNull = $ignoreNull;
return $new;
}
public function withDateTimeFormat(?string $format): static
{
$new = clone $this;
$new->dateTimeFormat = $format;
return $new;
}
/**
* @param mixed $value
* @return mixed
*/
protected function formatValue(mixed $value): mixed
{
$format = $this->dateTimeFormat ?? static::$mainDateTimeFormat;
if ($format && $value instanceof DateTimeInterface) {
return $value->format($format);
}
return $value;
}
/**
* @param array $values
* @psalm-param array<int, mixed> $values
*
* @return array
*/
protected function formatValues(array $values): array
{
return array_map([$this, 'formatValue'], $values);
}
public function toCriteriaArray(): array
{
if ($this->value === null) {
return $this->ignoreNull ? [] : (new IsNull($this->column))->toCriteriaArray();
}
if (is_array($this->value)) {
$value = $this->formatValues($this->value);
} else {
$value = $this->formatValue($this->value);
}
return [static::getOperator(), $this->column , $value];
}
}