Passed
Push — main ( f6abf4...1e45f3 )
by Sammy
02:02
created

TableModel::exists()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 2
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace HexMakina\TightORM;
4
5
use HexMakina\Crudites\Crudites;
6
use HexMakina\Crudites\Interfaces\TableManipulationInterface;
7
8
abstract class TableModel extends Crudites
9
{
10
11
    //check all primary keys are set (FIXME that doesn't work unles AIPK.. nice try)
12
    public function is_new(): bool
13
    {
14
        $match = static::table()->primary_keys_match(get_object_vars($this));
15
        return empty($match);
16
    }
17
18
    public function get_id($mode = null)
19
    {
20
        $primary_key = static::table()->auto_incremented_primary_key();
21
        if (is_null($primary_key) && count($pks = static::table()->primary_keys()) == 1) {
22
            $primary_key = current($pks);
23
        }
24
25
        return $mode === 'name' ? $primary_key->name() : $this->get($primary_key->name());
26
    }
27
28
    public function get($prop_name)
29
    {
30
        if (property_exists($this, $prop_name) === true) {
31
            return $this->$prop_name;
32
        }
33
34
        return null;
35
    }
36
37
    public function set($prop_name, $value)
38
    {
39
        $this->$prop_name = $value;
40
    }
41
42
    public function import($assoc_data)
43
    {
44
        if (!is_array($assoc_data)) {
45
            throw new \Exception(__FUNCTION__ . '(assoc_data) parm is not an array');
46
        }
47
48
        // shove it all up in model, god will sort them out
49
        foreach ($assoc_data as $field => $value) {
50
            $this->set($field, $value);
51
        }
52
53
        return $this;
54
    }
55
56
    public static function table(): TableManipulationInterface
57
    {
58
        $table = static::table_name();
59
        $table = self::inspect($table);
60
61
        return $table;
62
    }
63
64
    public static function table_name(): string
65
    {
66
        $reflect = new \ReflectionClass(get_called_class());
67
68
        $table_name = $reflect->getConstant('TABLE_NAME');
69
70
        if ($table_name === false) {
71
            $calling_class = $reflect->getShortName();
72
            if (defined($const_name = 'TABLE_' . strtoupper($calling_class))) {
73
                $table_name = constant($const_name);
74
            } else {
75
                $table_name = strtolower($calling_class);
76
            }
77
        }
78
79
        return $table_name;
80
    }
81
82
83
    public function to_table_row($operator_id = null)
84
    {
85
        if (!is_null($operator_id) && $this->is_new() && is_null($this->get('created_by'))) {
86
            $this->set('created_by', $operator_id);
87
        }
88
89
        $model_data = get_object_vars($this);
90
91
        // 1. Produce OR restore a row
92
        if ($this->is_new()) {
93
            $table_row = static::table()->produce($model_data);
94
        } else {
95
            $table_row = static::table()->restore($model_data);
96
        }
97
98
        // 2. Apply alterations from form_model data
99
        $table_row->alter($model_data);
100
101
        return $table_row;
102
    }
103
104
105
    public static function query_retrieve($filters = [], $options = []): SelectInterface
0 ignored issues
show
Unused Code introduced by
The parameter $filters is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

105
    public static function query_retrieve(/** @scrutinizer ignore-unused */ $filters = [], $options = []): SelectInterface

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $options is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

105
    public static function query_retrieve($filters = [], /** @scrutinizer ignore-unused */ $options = []): SelectInterface

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Bug introduced by
The type HexMakina\TightORM\SelectInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
106
    {
107
        return static::table()->select();
0 ignored issues
show
Bug Best Practice introduced by
The expression return static::table()->select() returns the type HexMakina\Crudites\Interfaces\SelectInterface which is incompatible with the type-hinted return HexMakina\TightORM\SelectInterface.
Loading history...
108
    }
109
110
111
    // success: return PK-indexed array of results (associative array or object)
112
    public static function retrieve(SelectInterface $Query): array
113
    {
114
        $ret = [];
115
        $pk_name = implode('_', array_keys($Query->table()->primary_keys()));
116
117
        if (count($pks = $Query->table()->primary_keys()) > 1) {
118
            $concat_pk = sprintf('CONCAT(%s) as %s', implode(',', $pks), $pk_name);
119
            $Query->select_also([$concat_pk]);
120
        }
121
122
        try {
123
            $Query->run();
124
        } catch (CruditesException $e) {
0 ignored issues
show
Bug introduced by
The type HexMakina\TightORM\CruditesException was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
125
            return [];
126
        }
127
128
        if ($Query->is_success()) {
129
            foreach ($Query->ret_obj(get_called_class()) as $rec) {
130
                  $ret[$rec->get($pk_name)] = $rec;
131
            }
132
        }
133
134
        return $ret;
135
    }
136
137
    /* USAGE
138
    * one($primary_key_value)
139
    * one($unique_column, $value)
140
    */
141
    public static function one($arg1, $arg2 = null)
142
    {
143
        $mixed_info = is_null($arg2) ? $arg1 : [$arg1 => $arg2];
144
145
        $unique_identifiers = get_called_class()::table()->match_uniqueness($mixed_info);
146
147
        if (empty($unique_identifiers)) {
148
            throw new CruditesException('UNIQUE_IDENTIFIER_NOT_FOUND');
149
        }
150
151
        $Query = static::query_retrieve([], ['eager' => true])->aw_fields_eq($unique_identifiers);
152
        switch (count($res = static::retrieve($Query))) {
153
            case 0:
154
                throw new CruditesException('INSTANCE_NOT_FOUND');
155
            case 1:
156
                return current($res);
157
            default:
158
                throw new CruditesException('SINGULAR_INSTANCE_ERROR');
159
        }
160
    }
161
162
    public static function exists($arg1, $arg2 = null)
163
    {
164
        try {
165
            return self::one($arg1, $arg2);
166
        } catch (CruditesException $e) {
167
            return null;
168
        }
169
    }
170
171
172
    public static function any($field_exact_values, $options = [])
173
    {
174
        $Query = static::query_retrieve([], $options)->aw_fields_eq($field_exact_values);
175
        return static::retrieve($Query);
176
    }
177
178
    public static function filter($filters = [], $options = []): array
179
    {
180
        return static::retrieve(static::query_retrieve($filters, $options));
181
    }
182
183
    public static function listing($filters = [], $options = []): array
184
    {
185
        return static::retrieve(static::query_retrieve($filters, $options)); // listing as arrays for templates
186
    }
187
188
189
190
    public static function get_many_by_AIPK($aipk_values)
191
    {
192
        if (!empty($aipk_values) && !is_null($AIPK = static::table()->auto_incremented_primary_key())) {
193
            return static::retrieve(static::table()->select()->aw_numeric_in($AIPK, $aipk_values));
194
        }
195
196
        return null;
197
    }
198
199
200
}
201