Passed
Push — master ( 23808e...c6ab07 )
by Jonas
10:42
created

MergedRelation   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Test Coverage

Coverage 97.22%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 31
dl 0
loc 122
ccs 35
cts 36
cp 0.9722
rs 10
c 1
b 0
f 0
wmc 14

7 Methods

Rating   Name   Duplication   Size   Complexity  
A paginate() 0 7 1
A shouldSelect() 0 9 2
A getResults() 0 11 3
A first() 0 5 2
A match() 0 9 2
A prepareQueryBuilder() 0 8 2
A get() 0 11 2
1
<?php
2
3
namespace Staudenmeir\LaravelMergedRelations\Eloquent\Relations;
4
5
use Illuminate\Database\Eloquent\Collection;
6
use Illuminate\Database\Eloquent\Relations\HasMany;
7
8
class MergedRelation extends HasMany
9
{
10
    /**
11
     * Get the results of the relationship.
12
     *
13
     * @return mixed
14
     */
15 20
    public function getResults()
16
    {
17 20
        $results = ! is_null($this->getParentKey())
18 20
            ? $this->get()
19
            : $this->related->newCollection();
20
21 20
        foreach ($results as $result) {
22 20
            unset($result->laravel_foreign_key);
23
        }
24
25 20
        return $results;
26
    }
27
28
    /**
29
     * Execute the query as a "select" statement.
30
     *
31
     * @param array $columns
32
     * @return \Illuminate\Database\Eloquent\Collection
33
     */
34 40
    public function get($columns = ['*'])
35
    {
36 40
        $builder = $this->prepareQueryBuilder($columns);
37
38 40
        $models = $builder->getModels();
39
40 40
        if (count($models) > 0) {
41 40
            $models = $builder->eagerLoadRelations($models);
42
        }
43
44 40
        return $this->related->newCollection($models);
45
    }
46
47
    /**
48
     * Execute the query and get the first related model.
49
     *
50
     * @param array $columns
51
     * @return mixed
52
     */
53 4
    public function first($columns = ['*'])
54
    {
55 4
        $results = $this->take(1)->get($columns);
56
57 4
        return count($results) > 0 ? $results->first() : null;
58
    }
59
60
    /**
61
     * Get a paginator for the "select" statement.
62
     *
63
     * @param int|null $perPage
64
     * @param array $columns
65
     * @param string $pageName
66
     * @param int $page
67
     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
68
     */
69 4
    public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
70
    {
71 4
        $this->query->addSelect(
72 4
            $this->shouldSelect($columns)
73
        );
74
75 4
        return $this->query->paginate($perPage, $columns, $pageName, $page);
76
    }
77
78
    /**
79
     * Prepare the query builder for query execution.
80
     *
81
     * @param array $columns
82
     * @return \Illuminate\Database\Eloquent\Builder
83
     */
84 40
    protected function prepareQueryBuilder($columns = ['*'])
85
    {
86 40
        $builder = $this->query->applyScopes();
87
88 40
        $columns = $builder->getQuery()->columns ? [] : $columns;
89
90 40
        return $builder->addSelect(
91 40
            $this->shouldSelect($columns)
92
        );
93
    }
94
95
    /**
96
     * Get the select columns for the relation query.
97
     *
98
     * @param array $columns
99
     * @return array
100
     */
101 44
    protected function shouldSelect(array $columns = ['*'])
102
    {
103 44
        if ($columns === ['*']) {
104 28
            return $columns;
105
        }
106
107 16
        return array_merge(
108 16
            $columns,
109 16
            ['laravel_foreign_key', 'laravel_model', 'laravel_placeholders', 'laravel_with']
110
        );
111
    }
112
113
    /**
114
     * Match the eagerly loaded results to their parents.
115
     *
116
     * @param array $models
117
     * @param \Illuminate\Database\Eloquent\Collection $results
118
     * @param string $relation
119
     * @return array
120
     */
121 4
    public function match(array $models, Collection $results, $relation)
122
    {
123 4
        $models = parent::match($models, $results, $relation);
124
125 4
        foreach ($results as $result) {
126 4
            unset($result->laravel_foreign_key);
127
        }
128
129 4
        return $models;
130
    }
131
}
132