1 | <?php |
||
2 | |||
3 | namespace HexMakina\TightORM; |
||
4 | |||
5 | use HexMakina\BlackBox\ORM\ModelInterface; |
||
6 | use HexMakina\BlackBox\Database\SelectInterface; |
||
7 | |||
8 | class TightModelSelector |
||
9 | { |
||
10 | |||
11 | private \HexMakina\BlackBox\ORM\ModelInterface $model; |
||
12 | |||
13 | private string $model_class; |
||
14 | |||
15 | private $model_table; |
||
16 | |||
17 | private \HexMakina\BlackBox\Database\SelectInterface $statement; |
||
18 | |||
19 | public function __construct(ModelInterface $model) |
||
20 | { |
||
21 | $this->model = $model; |
||
22 | $this->model_class = get_class($model); |
||
23 | $this->model_table = $this->model_class::table(); |
||
24 | $this->statement = $this->model_table->select(); |
||
25 | } |
||
26 | |||
27 | public function model(): ModelInterface |
||
28 | { |
||
29 | return $this->model; |
||
30 | } |
||
31 | |||
32 | public function class(): string |
||
33 | { |
||
34 | return $this->model_class; |
||
35 | } |
||
36 | |||
37 | public function statement(): SelectInterface |
||
38 | { |
||
39 | return $this->statement; |
||
40 | } |
||
41 | |||
42 | public function select($filters = [], $options = []): SelectInterface |
||
43 | { |
||
44 | $table_alias = $options['table_alias'] ?? get_class($this->model)::tableAlias(); |
||
45 | |||
46 | $this->statement = $this->model_table->select(null, $table_alias); |
||
47 | |||
48 | |||
49 | if (isset($options['order_by'])) { |
||
50 | $this->statement()->orderBy($options['order_by']); |
||
51 | } |
||
52 | |||
53 | if (isset($options['limit'])) { |
||
54 | if(is_array($options['limit'])){ |
||
55 | $this->statement()->limit($options['limit'][0], $options['limit'][1]); |
||
56 | } |
||
57 | elseif(is_numeric($options['limit'])){ |
||
58 | $this->statement()->limit($options['limit']); |
||
59 | } |
||
60 | } |
||
61 | $this->filter_with_fields($filters); |
||
62 | |||
63 | if (is_subclass_of($this->model(), '\HexMakina\kadro\Models\Interfaces\EventInterface')) { |
||
64 | $this->filter_event($filters['date_start'] ?? null, $filters['date_stop'] ?? null); |
||
65 | $this->statement()->orderBy([$this->model()->event_field(), 'DESC']); |
||
0 ignored issues
–
show
|
|||
66 | } |
||
67 | |||
68 | if (isset($filters['content'])) { |
||
69 | $this->statement()->whereFilterContent($filters['content']); |
||
70 | } |
||
71 | |||
72 | if (isset($filters['ids']) && is_array($filters['ids'])) { |
||
73 | $this->filter_with_ids(array_filter($filters['ids'], function($value) { return !is_null($value); })); |
||
74 | } |
||
75 | return $this->statement(); |
||
76 | } |
||
77 | |||
78 | public function filter_event($date_start = null, $date_stop = null): void |
||
79 | { |
||
80 | if (!empty($date_start)) { |
||
81 | $this->statement()->whereGTE($this->model()->event_field(), $date_start, $this->statement()->tableLabel(), ':filter_date_start'); |
||
82 | } |
||
83 | |||
84 | if (!empty($date_stop)) { |
||
85 | $this->statement()->whereLTE($this->model()->event_field(), $date_stop, $this->statement()->tableLabel(), ':filter_date_stop'); |
||
86 | } |
||
87 | // if(empty($options['order_by'])) |
||
88 | // $this->statement()->orderBy([$this->model()->event_field(), 'DESC']); |
||
89 | } |
||
90 | |||
91 | public function filter_with_ids($ids): void |
||
92 | { |
||
93 | if (empty($ids)) { |
||
94 | $this->statement()->where('1=0'); // TODO: this is a new low.. find another way to cancel query |
||
95 | } else { |
||
96 | $this->statement()->whereNumericIn('id', $ids); |
||
97 | } |
||
98 | } |
||
99 | |||
100 | public function filter_with_fields($filters, $filter_mode = 'whereEQ'): void |
||
101 | { |
||
102 | foreach ($this->model_table->columns() as $column_name => $column) { |
||
103 | if (isset($filters[$column_name]) && is_scalar($filters[$column_name])) { |
||
104 | $this->statement()->$filter_mode($column_name, $filters[$column_name], $this->statement()->tableLabel()); |
||
105 | } |
||
106 | } |
||
107 | } |
||
108 | } |
||
109 |
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.
This is most likely a typographical error or the method has been renamed.