-
Notifications
You must be signed in to change notification settings - Fork 0
/
Collection.php
99 lines (87 loc) · 2.71 KB
/
Collection.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
91
92
93
94
95
96
97
98
99
<?php
namespace GeometriaLab\Model\Persistent;
class Collection extends \GeometriaLab\Model\Collection implements CollectionInterface
{
/**
* Fetch models relations
*
* @param array|string|null $relationNames Array of relation names
* @param bool $refresh
* @return Collection
*/
public function fetchRelations($relationNames = null, $refresh = false)
{
if ($relationNames === null) {
$relations = $this->getRelations();
if (empty($relations)) {
return $this;
}
$relationNames = array_map(function($relation) {
return null;
}, $relations);
}
$relationNames = $this->parseRelationNames($relationNames);
foreach ($relationNames as $relationName => $childRelations) {
$relation = $this->getRelation($relationName);
if ($relation !== null) {
$relation->setTargetObjectsToCollection($this, $refresh, $childRelations);
}
}
$this->rewind();
return $this;
}
/**
* Parse relation names
*
* @param array|string|null $relationNames
* @return array
* @throws \InvalidArgumentException
*/
protected function parseRelationNames($relationNames = null)
{
$relations = array();
foreach ((array) $relationNames as $relationName => $childRelations) {
if (is_numeric($relationName)) {
if (!is_string($childRelations)) {
throw new \InvalidArgumentException("Child relation must be a string but " . gettype($childRelations) . " is given.");
}
$relationName = $childRelations;
$childRelations = null;
}
$relations[$relationName] = $childRelations;
}
return $relations;
}
/**
* Get relation by name
*
* @param string $name Relation name
* @return Relation\AbstractRelation|null
* @throws \InvalidArgumentException
*/
protected function getRelation($name)
{
$model = $this->getFirst();
if ($model instanceof AbstractModel) {
if (!$model->hasRelation($name)) {
throw new \InvalidArgumentException("Model doesn't have '{$name}' relation");
}
return $model->getRelation($name);
}
return null;
}
/**
* Get all relations
*
* @return Relation\AbstractRelation|null
*/
protected function getRelations()
{
$model = $this->getFirst();
if ($model instanceof AbstractModel) {
return $model->getRelations();
} else {
return array();
}
}
}