Collection::setIndexKey()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
1
<?php
2
3
namespace Nip\Records\Collections;
4
5
use Nip\Collections\Collection as AbstractCollection;
6
use Nip\HelperBroker;
7
use Nip\Records\AbstractModels\Record as Record;
8
use Nip\Records\AbstractModels\RecordManager as Records;
9
10
/**
11
 * Class Collection
12
 * @package Nip\Records\Collections
13
 */
14
class Collection extends AbstractCollection
15
{
16
    protected $_indexKey = false;
17
18
    /**
19
     * @var Records
20
     */
21
    protected $_manager = null;
22
23
24
    /**
25
     * @param $relations
26
     */
27
    public function loadRelations($relations)
28
    {
29
        if (is_string($relations)) {
30
            $relations = func_get_args();
31
        }
32
33
        foreach ($relations as $relation) {
34
            $this->loadRelation($relation);
35
        }
36
    }
37
38
    /**
39
     * @param $name
40
     * @return Collection
41
     */
42
    public function loadRelation($name)
43
    {
44
        $relation = $this->getRelation($name);
45
        $results = $relation->getEagerResults($this);
46
        $relation->match($this, $results);
47
        return $results;
48
    }
49
50
    /**
51
     * @param $name
52
     * @return \Nip\Records\Relations\Relation|null
53
     */
54
    public function getRelation($name)
55
    {
56
        return $this->getManager()->getRelation($name);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getManager()->getRelation($name) returns the type Nip\Records\AbstractMode...ections\Collection|true which is incompatible with the documented return type Nip\Records\Relations\Relation|null.
Loading history...
Bug introduced by
The method getRelation() does not exist on Nip\Records\AbstractModels\RecordManager. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

56
        return $this->getManager()->/** @scrutinizer ignore-call */ getRelation($name);
Loading history...
57
    }
58
59
    /**
60
     * @return Records
61
     */
62 1
    public function getManager()
63
    {
64 1
        if ($this->_manager == null) {
65
            $this->initManager();
66
        }
67
68 1
        return $this->_manager;
69
    }
70
71
    /**
72
     * @param Records $manager
73
     * @return $this
74
     */
75 2
    public function setManager(Records $manager)
76
    {
77 2
        $this->_manager = $manager;
78
79 2
        return $this;
80
    }
81
82
    public function initManager()
83
    {
84
        $manager = $this->rewind()->getManager();
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->rewind() targeting Nip\Collections\AbstractCollection::rewind() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
85
        $this->setManager($manager);
86
    }
87
88
    /**
89
     * @return string
90
     */
91
    public function toJSON()
92
    {
93
        $return = [];
94
        foreach ($this as $item) {
95
            $return = $item->toArray();
96
        }
97
98
        return json_encode($return);
99
    }
100
101
    public function save()
102
    {
103
        if (count($this) > 0) {
104
            foreach ($this as $item) {
105
                $item->save();
106
            }
107
        }
108
    }
109
110
    /**
111
     * @param Record $record
112
     * @param string $index
113
     */
114 4
    public function add($record, $index = null)
115
    {
116 4
        $index = $this->getRecordKey($record, $index);
0 ignored issues
show
Bug introduced by
It seems like $index can also be of type string; however, parameter $index of Nip\Records\Collections\Collection::getRecordKey() does only seem to accept null, maybe add an additional type check? ( Ignorable by Annotation )

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

116
        $index = $this->getRecordKey($record, /** @scrutinizer ignore-type */ $index);
Loading history...
117 4
        parent::add($record, $index);
118 4
    }
119
120
    /**
121
     * @param Record $record
122
     * @param null $index
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $index is correct as it would always require null to be passed?
Loading history...
123
     * @return string|null
124
     */
125 7
    public function getRecordKey(Record $record, $index = null)
126
    {
127 7
        if ($index) {
0 ignored issues
show
introduced by
$index is of type null, thus it always evaluated to false.
Loading history...
128 2
            return $this->generateRecordKeyByIndex($record, $index);
129
        }
130
131 5
        $index = $this->getIndexKey();
132 5
        if ($index) {
133
            return $this->generateRecordKeyByIndex($record, $index);
134
        }
135
136 5
        $index = $record->getPrimaryKey();
137 5
        if (is_array($index)) {
138
            return implode('-', $index);
139
        }
140 5
        return $index;
141
    }
142
143
    /**
144
     * @param Record $record
145
     * @param $index
146
     * @return mixed
147
     */
148 2
    protected function generateRecordKeyByIndex(Record $record, $index)
149
    {
150 2
        if (is_array($index)) {
151 1
            return $record->implodeFields($index);
152
        }
153
154 1
        return $record->{$index};
155
    }
156
157
    /**
158
     * @return bool
159
     */
160 5
    public function getIndexKey()
161
    {
162 5
        return $this->_indexKey;
163
    }
164
165
    /**
166
     * @param $key
167
     * @return mixed
168
     */
169
    public function setIndexKey($key)
170
    {
171
        return $this->_indexKey = $key;
172
    }
173
174
    /**
175
     * @param Record $record
176
     * @return bool
177
     */
178
    public function has($record)
179
    {
180
        if ($record instanceof Record) {
0 ignored issues
show
introduced by
$record is always a sub-type of Nip\Records\AbstractModels\Record.
Loading history...
181
            return $this->hasRecord($record);
182
        }
183
184
        return parent::has($record);
185
    }
186
187
    /**
188
     * @param Record $record
189
     * @return bool
190
     */
191
    public function hasRecord(Record $record)
192
    {
193
        $index = $this->getRecordKey($record);
194
195
        return parent::has($index) && $this->get($index) == $record;
196
    }
197
198
    /**
199
     * @param $record
200
     */
201
    public function remove($record)
202
    {
203
        foreach ($this as $key => $item) {
204
            if ($item == $record) {
205
                unset($this[$key]);
206
            }
207
        }
208
    }
209
210
    /**
211
     * When $each is true, each record gets it's delete() method called.
212
     * Otherwise, a delete query is built for the entire collection
213
     *
214
     * @param bool $each
215
     * @return $this
216
     */
217
    public function delete($each = false)
218
    {
219
        if (count($this) > 0) {
220
            if ($each) {
221
                foreach ($this as $item) {
222
                    $item->delete();
223
                }
224
            } else {
225
                $primaryKey = $this->getManager()->getPrimaryKey();
226
                $pk_list = HelperBroker::get('Arrays')->pluck($this, $primaryKey);
0 ignored issues
show
Bug introduced by
The method pluck() does not exist on Nip\Helpers\AbstractHelper. It seems like you code against a sub-type of Nip\Helpers\AbstractHelper such as Nip_Helper_Url or Nip_Helper_Arrays or Nip\Helpers\View\Stylesheets or Nip\Helpers\View\Strings or Nip\Helpers\View\Paginator or Nip\Helpers\View\Arrays or Nip\Helpers\View\Icontext or Nip\Helpers\View\Color or Nip\Helpers\View\Scripts or Nip\Helpers\View\Url. ( Ignorable by Annotation )

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

226
                $pk_list = HelperBroker::get('Arrays')->/** @scrutinizer ignore-call */ pluck($this, $primaryKey);
Loading history...
227
228
                $query = $this->getManager()->newQuery("delete");
229
                $query->where("$primaryKey IN ?", $pk_list);
230
                $query->execute();
231
            }
232
233
            $this->clear();
234
        }
235
236
        return $this;
237
    }
238
}
239