Passed
Push — master ( 195c3c...dafd3a )
by Andrey
05:04
created

HasRelationships::newBelongsToMany()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 8
dl 0
loc 4
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace Volosyuk\SimpleEloquent\Relations;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Database\Eloquent\Relations\Relation as BaseRelation;
7
use Illuminate\Support\Arr;
8
use Illuminate\Support\Str;
9
use Illuminate\Database\Eloquent\Builder;
10
11
/**
12
 * Include relations definitions to eloquent
13
 *
14
 * @package Volosyuk\SimpleEloquent
15
 */
16
trait HasRelationships
17
{
18
    /**
19
     * Define a one-to-one relationship.
20
     *
21
     * @param string $related
22
     * @param string $foreignKey
23
     * @param string $localKey
24
     * @return HasOne
25
     */
26 2
    public function hasOne($related, $foreignKey = null, $localKey = null)
27
    {
28
        /**
29
         * @var Model $instance
30
         */
31 2
        $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

31
        /** @scrutinizer ignore-call */ 
32
        $instance = $this->newRelatedInstance($related);
Loading history...
32
33 2
        $foreignKey = $foreignKey ?: $this->getForeignKey();
0 ignored issues
show
Bug introduced by
It seems like getForeignKey() 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

33
        $foreignKey = $foreignKey ?: $this->/** @scrutinizer ignore-call */ getForeignKey();
Loading history...
34
35 2
        $localKey = $localKey ?: $this->getKeyName();
0 ignored issues
show
Bug introduced by
It seems like getKeyName() 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

35
        $localKey = $localKey ?: $this->/** @scrutinizer ignore-call */ getKeyName();
Loading history...
36
37 2
        return $this->newHasOne($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey);
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...ationships::newHasOne(). ( Ignorable by Annotation )

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

37
        return $this->newHasOne($instance->newQuery(), /** @scrutinizer ignore-type */ $this, $instance->getTable().'.'.$foreignKey, $localKey);
Loading history...
38
    }
39
40
    /**
41
     * Instantiate a new HasOne relationship.
42
     *
43
     * @param Builder $query
44
     * @param Model $parent
45
     * @param string $foreignKey
46
     * @param string $localKey
47
     * @return HasOne
48
     */
49 2
    protected function newHasOne(Builder $query, Model $parent, $foreignKey, $localKey)
50
    {
51 2
        return new HasOne($query, $parent, $foreignKey, $localKey);
52
    }
53
54
    /**
55
     * Define a polymorphic one-to-one relationship.
56
     *
57
     * @param string $related
58
     * @param string $name
59
     * @param string $type
60
     * @param string $id
61
     * @param string $localKey
62
     * @return MorphOne
63
     */
64 2
    public function morphOne($related, $name, $type = null, $id = null, $localKey = null)
65
    {
66
        /**
67
         * @var Model $instance
68
         */
69 2
        $instance = $this->newRelatedInstance($related);
70
71 2
        list($type, $id) = $this->getMorphs($name, $type, $id);
0 ignored issues
show
Bug introduced by
It seems like getMorphs() 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

71
        /** @scrutinizer ignore-call */ 
72
        list($type, $id) = $this->getMorphs($name, $type, $id);
Loading history...
72
73 2
        $table = $instance->getTable();
74
75 2
        $localKey = $localKey ?: $this->getKeyName();
76
77 2
        return $this->newMorphOne($instance->newQuery(), $this, $table.'.'.$type, $table.'.'.$id, $localKey);
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...ionships::newMorphOne(). ( Ignorable by Annotation )

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

77
        return $this->newMorphOne($instance->newQuery(), /** @scrutinizer ignore-type */ $this, $table.'.'.$type, $table.'.'.$id, $localKey);
Loading history...
78
    }
79
80
    /**
81
     * Instantiate a new MorphOne relationship.
82
     *
83
     * @param Builder $query
84
     * @param Model $parent
85
     * @param string $type
86
     * @param string $id
87
     * @param string $localKey
88
     * @return MorphOne
89
     */
90 2
    protected function newMorphOne(Builder $query, Model $parent, $type, $id, $localKey)
91
    {
92 2
        return new MorphOne($query, $parent, $type, $id, $localKey);
93
    }
94
95
    /**
96
     * Define an inverse one-to-one or many relationship.
97
     *
98
     * @param string $related
99
     * @param string $foreignKey
100
     * @param string $ownerKey
101
     * @param string $relation
102
     * @return BelongsTo
103
     */
104 2
    public function belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null)
105
    {
106 2
        if (is_null($relation)) {
107 2
            $relation = $this->guessBelongsToRelation();
108
        }
109
110
        /**
111
         * @var Model $instance
112
         */
113 2
        $instance = $this->newRelatedInstance($related);
114
115 2
        if (is_null($foreignKey)) {
116 2
            $foreignKey = Str::snake($relation).'_'.$instance->getKeyName();
117
        }
118
119 2
        $ownerKey = $ownerKey ?: $instance->getKeyName();
120
121 2
        return $this->newBelongsTo(
122 2
            $instance->newQuery(), $this, $foreignKey, $ownerKey, $relation
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $child of Volosyuk\SimpleEloquent\...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

122
            $instance->newQuery(), /** @scrutinizer ignore-type */ $this, $foreignKey, $ownerKey, $relation
Loading history...
123
        );
124
    }
125
126
    /**
127
     * Instantiate a new BelongsTo relationship.
128
     *
129
     * @param Builder $query
130
     * @param Model $child
131
     * @param string $foreignKey
132
     * @param string $ownerKey
133
     * @param string $relation
134
     * @return BelongsTo
135
     */
136 2
    protected function newBelongsTo(Builder $query, Model $child, $foreignKey, $ownerKey, $relation)
137
    {
138 2
        return new BelongsTo($query, $child, $foreignKey, $ownerKey, $relation);
139
    }
140
141
    /**
142
     * Define a polymorphic, inverse one-to-one or many relationship.
143
     *
144
     * @param string $name
145
     * @param string $type
146
     * @param string $id
147
     * @param string $ownerKey
148
     * @return MorphTo
149
     */
150 2
    public function morphTo($name = null, $type = null, $id = null, $ownerKey = null)
151
    {
152 2
        $name = $name ?: $this->guessBelongsToRelation();
153
154 2
        list($type, $id) = $this->getMorphs(
155 2
            Str::snake($name), $type, $id
156
        );
157
158 2
        return empty($class = $this->{$type})
159 1
            ? $this->morphEagerTo($name, $type, $id, $ownerKey)
160 2
            : $this->morphInstanceTo($class, $name, $type, $id, $ownerKey);
161
    }
162
163
    /**
164
     * Define a polymorphic, inverse one-to-one or many relationship.
165
     *
166
     * @param string $name
167
     * @param string $type
168
     * @param string $id
169
     * @param string $ownerKey
170
     * @return MorphTo
171
     */
172 1
    protected function morphEagerTo($name, $type, $id, $ownerKey)
173
    {
174 1
        return $this->newMorphTo(
175 1
            $this->newQuery()->setEagerLoads([]), $this, $id, $ownerKey, $type, $name
0 ignored issues
show
Bug introduced by
It seems like newQuery() 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

175
            $this->/** @scrutinizer ignore-call */ 
176
                   newQuery()->setEagerLoads([]), $this, $id, $ownerKey, $type, $name
Loading history...
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...tionships::newMorphTo(). ( Ignorable by Annotation )

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

175
            $this->newQuery()->setEagerLoads([]), /** @scrutinizer ignore-type */ $this, $id, $ownerKey, $type, $name
Loading history...
176
        );
177
    }
178
179
    /**
180
     * Define a polymorphic, inverse one-to-one or many relationship.
181
     *
182
     * @param string $target
183
     * @param string $name
184
     * @param string $type
185
     * @param string $id
186
     * @param string $ownerKey
187
     * @return MorphTo
188
     */
189 2
    protected function morphInstanceTo($target, $name, $type, $id, $ownerKey)
190
    {
191
        /**
192
         * @var Model $instance
193
         */
194 2
        $instance = $this->newRelatedInstance(
195 2
            static::getActualClassNameForMorph($target)
196
        );
197
198 2
        return $this->newMorphTo(
199 2
            $instance->newQuery(), $this, $id, $ownerKey ?? $instance->getKeyName(), $type, $name
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...tionships::newMorphTo(). ( Ignorable by Annotation )

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

199
            $instance->newQuery(), /** @scrutinizer ignore-type */ $this, $id, $ownerKey ?? $instance->getKeyName(), $type, $name
Loading history...
200
        );
201
    }
202
203
    /**
204
     * Instantiate a new MorphTo relationship.
205
     *
206
     * @param Builder $query
207
     * @param Model $parent
208
     * @param string $foreignKey
209
     * @param string $ownerKey
210
     * @param string $type
211
     * @param string $relation
212
     * @return MorphTo
213
     */
214 2
    protected function newMorphTo(Builder $query, Model $parent, $foreignKey, $ownerKey, $type, $relation)
215
    {
216 2
        return new MorphTo($query, $parent, $foreignKey, $ownerKey, $type, $relation);
217
    }
218
219
    /**
220
     * Retrieve the actual class name for a given morph class.
221
     *
222
     * @param string $class
223
     * @return string
224
     */
225 2
    public static function getActualClassNameForMorph($class)
226
    {
227 2
        return Arr::get(BaseRelation::morphMap() ?: [], $class, $class);
228
    }
229
230
    /**
231
     * Guess the "belongs to" relationship name.
232
     *
233
     * @return string
234
     */
235 2
    protected function guessBelongsToRelation()
236
    {
237 2
        list($one, $two, $caller) = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
238
239 2
        return $caller['function'];
240
    }
241
242
    /**
243
     * Define a one-to-many relationship.
244
     *
245
     * @param string $related
246
     * @param string $foreignKey
247
     * @param string $localKey
248
     * @return HasMany
249
     */
250 3
    public function hasMany($related, $foreignKey = null, $localKey = null)
251
    {
252
        /**
253
         * @var Model $instance
254
         */
255 3
        $instance = $this->newRelatedInstance($related);
256
257 3
        $foreignKey = $foreignKey ?: $this->getForeignKey();
258
259 3
        $localKey = $localKey ?: $this->getKeyName();
260
261 3
        return $this->newHasMany(
262 3
            $instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...tionships::newHasMany(). ( Ignorable by Annotation )

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

262
            $instance->newQuery(), /** @scrutinizer ignore-type */ $this, $instance->getTable().'.'.$foreignKey, $localKey
Loading history...
263
        );
264
    }
265
266
    /**
267
     * Instantiate a new HasMany relationship.
268
     *
269
     * @param Builder $query
270
     * @param Model $parent
271
     * @param string $foreignKey
272
     * @param string $localKey
273
     * @return HasMany
274
     */
275 3
    protected function newHasMany(Builder $query, Model $parent, $foreignKey, $localKey)
276
    {
277 3
        return new HasMany($query, $parent, $foreignKey, $localKey);
278
    }
279
280
    /**
281
     * Define a has-many-through relationship.
282
     *
283
     * @param string $related
284
     * @param string $through
285
     * @param string|null $firstKey
286
     * @param string|null $secondKey
287
     * @param string|null $localKey
288
     * @param string|null $secondLocalKey
289
     * @return HasManyThrough
290
     */
291 2
    public function hasManyThrough($related, $through, $firstKey = null, $secondKey = null, $localKey = null, $secondLocalKey = null)
292
    {
293
        /**
294
         * @var Model $through
295
         */
296 2
        $through = new $through;
297
298 2
        $firstKey = $firstKey ?: $this->getForeignKey();
299
300 2
        $secondKey = $secondKey ?: $through->getForeignKey();
301
302 2
        return $this->newHasManyThrough(
303 2
            $this->newRelatedInstance($related)->newQuery(), $this, $through,
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $farParent of Volosyuk\SimpleEloquent\...ps::newHasManyThrough(). ( Ignorable by Annotation )

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

303
            $this->newRelatedInstance($related)->newQuery(), /** @scrutinizer ignore-type */ $this, $through,
Loading history...
304 2
            $firstKey, $secondKey, $localKey ?: $this->getKeyName(),
305 2
            $secondLocalKey ?: $through->getKeyName()
306
        );
307
    }
308
309
    /**
310
     * Instantiate a new HasManyThrough relationship.
311
     *
312
     * @param Builder $query
313
     * @param Model $farParent
314
     * @param Model $throughParent
315
     * @param string $firstKey
316
     * @param string $secondKey
317
     * @param string $localKey
318
     * @param string $secondLocalKey
319
     * @return HasManyThrough
320
     */
321 2
    protected function newHasManyThrough(Builder $query, Model $farParent, Model $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey)
322
    {
323 2
        return new HasManyThrough($query, $farParent, $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey);
324
    }
325
326
    /**
327
     * Define a polymorphic one-to-many relationship.
328
     *
329
     * @param string $related
330
     * @param string $name
331
     * @param string $type
332
     * @param string $id
333
     * @param string $localKey
334
     * @return MorphMany
335
     */
336 2
    public function morphMany($related, $name, $type = null, $id = null, $localKey = null)
337
    {
338
        /**
339
         * @var Model $instance
340
         */
341 2
        $instance = $this->newRelatedInstance($related);
342
343 2
        list($type, $id) = $this->getMorphs($name, $type, $id);
344
345 2
        $table = $instance->getTable();
346
347 2
        $localKey = $localKey ?: $this->getKeyName();
348
349 2
        return $this->newMorphMany($instance->newQuery(), $this, $table.'.'.$type, $table.'.'.$id, $localKey);
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...onships::newMorphMany(). ( Ignorable by Annotation )

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

349
        return $this->newMorphMany($instance->newQuery(), /** @scrutinizer ignore-type */ $this, $table.'.'.$type, $table.'.'.$id, $localKey);
Loading history...
350
    }
351
352
    /**
353
     * Instantiate a new MorphMany relationship.
354
     *
355
     * @param Builder $query
356
     * @param Model $parent
357
     * @param string $type
358
     * @param string $id
359
     * @param string $localKey
360
     * @return MorphMany
361
     */
362 2
    protected function newMorphMany(Builder $query, Model $parent, $type, $id, $localKey)
363
    {
364 2
        return new MorphMany($query, $parent, $type, $id, $localKey);
365
    }
366
367
    /**
368
     * Define a many-to-many relationship.
369
     *
370
     * @param string $related
371
     * @param string $table
372
     * @param string $foreignPivotKey
373
     * @param string $relatedPivotKey
374
     * @param string $parentKey
375
     * @param string $relatedKey
376
     * @param string $relation
377
     * @return BelongsToMany
378
     */
379 3
    public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null,
380
                                  $parentKey = null, $relatedKey = null, $relation = null)
381
    {
382 3
        if (is_null($relation)) {
383 3
            $relation = $this->guessBelongsToManyRelation();
0 ignored issues
show
Bug introduced by
The method guessBelongsToManyRelation() does not exist on Volosyuk\SimpleEloquent\Relations\HasRelationships. Did you maybe mean guessBelongsToRelation()? ( Ignorable by Annotation )

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

383
            /** @scrutinizer ignore-call */ 
384
            $relation = $this->guessBelongsToManyRelation();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
384
        }
385
386
        /**
387
         * @var Model $instance
388
         */
389 3
        $instance = $this->newRelatedInstance($related);
390
391 3
        $foreignPivotKey = $foreignPivotKey ?: $this->getForeignKey();
392
393 3
        $relatedPivotKey = $relatedPivotKey ?: $instance->getForeignKey();
394
395 3
        if (is_null($table)) {
396 3
            $table = $this->joiningTable($related, $instance);
0 ignored issues
show
Bug introduced by
It seems like joiningTable() 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

396
            /** @scrutinizer ignore-call */ 
397
            $table = $this->joiningTable($related, $instance);
Loading history...
397
        }
398
399 3
        return $this->newBelongsToMany(
400 3
            $instance->newQuery(), $this, $table, $foreignPivotKey,
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...ips::newBelongsToMany(). ( Ignorable by Annotation )

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

400
            $instance->newQuery(), /** @scrutinizer ignore-type */ $this, $table, $foreignPivotKey,
Loading history...
401 3
            $relatedPivotKey, $parentKey ?: $this->getKeyName(),
402 3
            $relatedKey ?: $instance->getKeyName(), $relation
403
        );
404
    }
405
406
    /**
407
     * Instantiate a new BelongsToMany relationship.
408
     *
409
     * @param Builder $query
410
     * @param Model $parent
411
     * @param string $table
412
     * @param string $foreignPivotKey
413
     * @param string $relatedPivotKey
414
     * @param string $parentKey
415
     * @param string $relatedKey
416
     * @param string $relationName
417
     * @return BelongsToMany
418
     */
419 3
    protected function newBelongsToMany(Builder $query, Model $parent, $table, $foreignPivotKey, $relatedPivotKey,
420
                                        $parentKey, $relatedKey, $relationName = null)
421
    {
422 3
        return new BelongsToMany($query, $parent, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey, $relationName);
423
    }
424
425
    /**
426
     * Define a polymorphic many-to-many relationship.
427
     *
428
     * @param string $related
429
     * @param string $name
430
     * @param string $table
431
     * @param string $foreignPivotKey
432
     * @param string $relatedPivotKey
433
     * @param string $parentKey
434
     * @param string $relatedKey
435
     * @param  bool  $inverse
436
     * @return MorphToMany
437
     */
438 4
    public function morphToMany($related, $name, $table = null, $foreignPivotKey = null,
439
                                $relatedPivotKey = null, $parentKey = null,
440
                                $relatedKey = null, $inverse = false)
441
    {
442 4
        $caller = $this->guessBelongsToManyRelation();
443
444
        /**
445
         * @var Model $instance
446
         */
447 4
        $instance = $this->newRelatedInstance($related);
448
449 4
        $foreignPivotKey = $foreignPivotKey ?: $name.'_id';
450
451 4
        $relatedPivotKey = $relatedPivotKey ?: $instance->getForeignKey();
452
453 4
        $table = $table ?: Str::plural($name);
454
455 4
        return $this->newMorphToMany(
456 4
            $instance->newQuery(), $this, $name, $table,
0 ignored issues
show
Bug introduced by
$this of type Volosyuk\SimpleEloquent\Relations\HasRelationships is incompatible with the type Illuminate\Database\Eloquent\Model expected by parameter $parent of Volosyuk\SimpleEloquent\...ships::newMorphToMany(). ( Ignorable by Annotation )

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

456
            $instance->newQuery(), /** @scrutinizer ignore-type */ $this, $name, $table,
Loading history...
457 4
            $foreignPivotKey, $relatedPivotKey, $parentKey ?: $this->getKeyName(),
458 4
            $relatedKey ?: $instance->getKeyName(), $caller, $inverse
459
        );
460
    }
461
462
    /**
463
     * Instantiate a new HasManyThrough relationship.
464
     *
465
     * @param Builder $query
466
     * @param Model $parent
467
     * @param string $name
468
     * @param string $table
469
     * @param string $foreignPivotKey
470
     * @param string $relatedPivotKey
471
     * @param string $parentKey
472
     * @param string $relatedKey
473
     * @param string $relationName
474
     * @param  bool  $inverse
475
     * @return MorphToMany
476
     */
477 4
    protected function newMorphToMany(Builder $query, Model $parent, $name, $table, $foreignPivotKey,
478
                                      $relatedPivotKey, $parentKey, $relatedKey,
479
                                      $relationName = null, $inverse = false)
480
    {
481 4
        return new MorphToMany($query, $parent, $name, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey,
482 4
            $relationName, $inverse);
483
    }
484
485
    /**
486
     * Define a polymorphic, inverse many-to-many relationship.
487
     *
488
     * @param string $related
489
     * @param string $name
490
     * @param string $table
491
     * @param string $foreignPivotKey
492
     * @param string $relatedPivotKey
493
     * @param string $parentKey
494
     * @param string $relatedKey
495
     * @return MorphToMany
496
     */
497 2
    public function morphedByMany($related, $name, $table = null, $foreignPivotKey = null,
498
                                  $relatedPivotKey = null, $parentKey = null, $relatedKey = null)
499
    {
500 2
        $foreignPivotKey = $foreignPivotKey ?: $this->getForeignKey();
501
502 2
        $relatedPivotKey = $relatedPivotKey ?: $name.'_id';
503
504 2
        return $this->morphToMany(
505 2
            $related, $name, $table, $foreignPivotKey,
506 2
            $relatedPivotKey, $parentKey, $relatedKey, true
507
        );
508
    }
509
}
510