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

MergedRelation::prepareQueryBuilder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 8
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
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