Passed
Pull Request — master (#10)
by Maksim
05:21 queued 02:36
created

CompositeRelationships::newMorphOne()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 5
1
<?php
2
3
namespace MaksimM\CompositePrimaryKeys\Http\Traits;
4
5
use Closure;
6
use Illuminate\Database\Eloquent\Builder;
7
use Illuminate\Database\Eloquent\Model;
8
use Illuminate\Database\Eloquent\Relations\BelongsTo;
9
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
10
use Illuminate\Database\Eloquent\Relations\HasMany;
11
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
12
use Illuminate\Database\Eloquent\Relations\HasOne;
13
use Illuminate\Database\Eloquent\Relations\MorphMany;
14
use Illuminate\Database\Eloquent\Relations\MorphOne;
15
use Illuminate\Database\Eloquent\Relations\MorphTo;
16
use Illuminate\Database\Eloquent\Relations\MorphToMany;
17
use Illuminate\Support\Str;
18
use MaksimM\CompositePrimaryKeys\Eloquent\Relationships\CompositeBelongsTo;
19
20
trait CompositeRelationships
21
{
22
    /**
23
     * @param      $related
24
     * @param null $foreignKey
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $foreignKey is correct as it would always require null to be passed?
Loading history...
25
     * @param null $ownerKey
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $ownerKey is correct as it would always require null to be passed?
Loading history...
26
     * @param null $relation
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $relation is correct as it would always require null to be passed?
Loading history...
27
     *
28
     * @return BelongsTo
29
     */
30
    public function belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null)
31
    {
32
        // If no relation name was given, we will use this debug backtrace to extract
33
        // the calling method's name and use that as the relationship name as most
34
        // of the time this will be what we desire to use for the relationships.
35
        if (is_null($relation)) {
0 ignored issues
show
introduced by
The condition is_null($relation) is always true.
Loading history...
36
            $relation = $this->guessBelongsToRelation();
0 ignored issues
show
Bug introduced by
It seems like guessBelongsToRelation() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

36
            /** @scrutinizer ignore-call */ 
37
            $relation = $this->guessBelongsToRelation();
Loading history...
37
        }
38
39
        /**
40
         * @var Model $instance
41
         */
42
        $instance = $this->newRelatedInstance($related);
0 ignored issues
show
Bug introduced by
It seems like newRelatedInstance() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

42
        /** @scrutinizer ignore-call */ 
43
        $instance = $this->newRelatedInstance($related);
Loading history...
43
44
        // If no foreign key was supplied, we can use a backtrace to guess the proper
45
        // foreign key name by using the name of the relationship function, which
46
        // when combined with an "_id" should conventionally match the columns.
47
        if (is_null($foreignKey)) {
0 ignored issues
show
introduced by
The condition is_null($foreignKey) is always true.
Loading history...
48
            $foreignKey = is_array($instance->getKeyName()) ? array_map(
0 ignored issues
show
introduced by
The condition is_array($instance->getKeyName()) is always false.
Loading history...
49
                function ($key) use ($relation) {
50
                    return Str::snake($relation).'_'.$key;
51
                },
52
                $instance->getKeyName()
53
            ) : Str::snake($relation).'_'.$instance->getKeyName();
54
        }
55
56
        // Once we have the foreign key names, we'll just create a new Eloquent query
57
        // for the related models and returns the relationship instance which will
58
        // actually be responsible for retrieving and hydrating every relations.
59
        $ownerKey = $ownerKey ?: $instance->getKeyName();
0 ignored issues
show
introduced by
$ownerKey is of type null, thus it always evaluated to false.
Loading history...
60
61
        $relationQuery = $this->newBelongsTo(
62
            $instance->newQuery(),
63
            $this,
0 ignored issues
show
Bug introduced by
$this of type MaksimM\CompositePrimary...\CompositeRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $child of MaksimM\CompositePrimary...onships::newBelongsTo(). ( Ignorable by Annotation )

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

63
            /** @scrutinizer ignore-type */ $this,
Loading history...
64
            $foreignKey,
65
            $ownerKey,
66
            $relation
67
        );
68
69
        return $relationQuery;
70
    }
71
72
    protected function executeWithinOptionalBinaryTransformation(Closure $relation, ...$models)
73
    {
74
        foreach ($models as $model) {
75
            if (method_exists($model, 'disableBinaryMutators')) {
76
                $model->disableBinaryMutators();
77
            }
78
        }
79
        $relationResult = $relation();
80
        foreach ($models as $model) {
81
            if (method_exists($model, 'enableBinaryMutators')) {
82
                $model->enableBinaryMutators();
83
            }
84
        }
85
86
        return $relationResult;
87
    }
88
89
    /**
90
     * Instantiate a new BelongsTo relationship.
91
     *
92
     * @param Builder $query
93
     * @param Model   $child
94
     * @param string  $foreignKey
95
     * @param string  $ownerKey
96
     * @param string  $relation
97
     *
98
     * @return BelongsTo
99
     */
100
    protected function newBelongsTo(Builder $query, Model $child, $foreignKey, $ownerKey, $relation)
101
    {
102
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $child, $foreignKey, $ownerKey, $relation) {
103
            return new CompositeBelongsTo($query, $child, $foreignKey, $ownerKey, $relation);
104
        }, $query->getModel(), $child);
105
    }
106
107
    /**
108
     * Instantiate a new HasOne relationship.
109
     *
110
     * @param Builder $query
111
     * @param Model   $parent
112
     * @param string  $foreignKey
113
     * @param string  $localKey
114
     *
115
     * @return HasOne
116
     */
117
    protected function newHasOne(Builder $query, Model $parent, $foreignKey, $localKey)
118
    {
119
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $foreignKey, $localKey) {
120
            return new HasOne($query, $parent, $foreignKey, $localKey);
121
        }, $query->getModel(), $parent);
122
    }
123
124
    /**
125
     * Instantiate a new MorphOne relationship.
126
     *
127
     * @param Builder $query
128
     * @param Model   $parent
129
     * @param string  $type
130
     * @param string  $id
131
     * @param string  $localKey
132
     *
133
     * @return MorphOne
134
     */
135
    protected function newMorphOne(Builder $query, Model $parent, $type, $id, $localKey)
136
    {
137
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $type, $id, $localKey) {
138
            return new MorphOne($query, $parent, $type, $id, $localKey);
139
        }, $query->getModel(), $parent);
140
    }
141
142
    /**
143
     * Instantiate a new MorphTo relationship.
144
     *
145
     * @param Builder $query
146
     * @param Model   $parent
147
     * @param string  $foreignKey
148
     * @param string  $ownerKey
149
     * @param string  $type
150
     * @param string  $relation
151
     *
152
     * @return MorphTo
153
     */
154
    protected function newMorphTo(Builder $query, Model $parent, $foreignKey, $ownerKey, $type, $relation)
155
    {
156
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $foreignKey, $ownerKey, $type, $relation) {
157
            return new MorphTo($query, $parent, $foreignKey, $ownerKey, $type, $relation);
158
        }, $query->getModel(), $parent);
159
    }
160
161
    /**
162
     * Instantiate a new HasMany relationship.
163
     *
164
     * @param Builder $query
165
     * @param Model   $parent
166
     * @param string  $foreignKey
167
     * @param string  $localKey
168
     *
169
     * @return HasMany
170
     */
171
    protected function newHasMany(Builder $query, Model $parent, $foreignKey, $localKey)
172
    {
173
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $foreignKey, $localKey) {
174
            return new HasMany($query, $parent, $foreignKey, $localKey);
175
        }, $query->getModel(), $parent);
176
    }
177
178
    /**
179
     * Instantiate a new HasManyThrough relationship.
180
     *
181
     * @param Builder $query
182
     * @param Model   $farParent
183
     * @param Model   $throughParent
184
     * @param string  $firstKey
185
     * @param string  $secondKey
186
     * @param string  $localKey
187
     * @param string  $secondLocalKey
188
     *
189
     * @return HasManyThrough
190
     */
191
    protected function newHasManyThrough(Builder $query, Model $farParent, Model $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey)
192
    {
193
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $farParent, $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey) {
194
            return new HasManyThrough($query, $farParent, $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey);
195
        }, $query->getModel(), $farParent);
196
    }
197
198
    /**
199
     * Instantiate a new MorphMany relationship.
200
     *
201
     * @param Builder $query
202
     * @param Model   $parent
203
     * @param string  $type
204
     * @param string  $id
205
     * @param string  $localKey
206
     *
207
     * @return MorphMany
208
     */
209
    protected function newMorphMany(Builder $query, Model $parent, $type, $id, $localKey)
210
    {
211
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $type, $id, $localKey) {
212
            return new MorphMany($query, $parent, $type, $id, $localKey);
213
        }, $query->getModel(), $parent);
214
    }
215
216
    /**
217
     * Instantiate a new BelongsToMany relationship.
218
     *
219
     * @param Builder $query
220
     * @param Model   $parent
221
     * @param string  $table
222
     * @param string  $foreignPivotKey
223
     * @param string  $relatedPivotKey
224
     * @param string  $parentKey
225
     * @param string  $relatedKey
226
     * @param string  $relationName
227
     *
228
     * @return BelongsToMany
229
     */
230
    protected function newBelongsToMany(Builder $query, Model $parent, $table, $foreignPivotKey, $relatedPivotKey,
231
        $parentKey, $relatedKey, $relationName = null)
232
    {
233
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey, $relationName) {
234
            return new BelongsToMany($query, $parent, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey, $relationName);
235
        }, $query->getModel(), $parent);
236
    }
237
238
    /**
239
     * Instantiate a new MorphToMany relationship.
240
     *
241
     * @param Builder $query
242
     * @param Model   $parent
243
     * @param string  $name
244
     * @param string  $table
245
     * @param string  $foreignPivotKey
246
     * @param string  $relatedPivotKey
247
     * @param string  $parentKey
248
     * @param string  $relatedKey
249
     * @param string  $relationName
250
     * @param bool    $inverse
251
     *
252
     * @return MorphToMany
253
     */
254
    protected function newMorphToMany(Builder $query, Model $parent, $name, $table, $foreignPivotKey,
255
        $relatedPivotKey, $parentKey, $relatedKey,
256
        $relationName = null, $inverse = false)
257
    {
258
        return $this->executeWithinOptionalBinaryTransformation(function () use ($query, $parent, $name, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey,
259
            $relationName, $inverse) {
260
            return new MorphToMany($query, $parent, $name, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey,
261
                $relationName, $inverse);
262
        }, $query->getModel(), $parent);
263
    }
264
}
265