Passed
Push — master ( 0f718c...f63467 )
by Jonas
01:55
created

throughParentInstanceSoftDeletes()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
namespace Staudenmeir\EloquentHasManyDeep\Eloquent\Relations\Traits;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Database\Eloquent\SoftDeletes;
8
use Illuminate\Database\Query\JoinClause;
9
use Staudenmeir\EloquentHasManyDeep\Eloquent\CompositeKey;
10
11
trait JoinsThroughParents
12
{
13
    /**
14
     * Join a through parent table.
15
     *
16
     * @param \Illuminate\Database\Eloquent\Builder $query
17
     * @param \Illuminate\Database\Eloquent\Model $throughParent
18
     * @param \Illuminate\Database\Eloquent\Model $predecessor
19
     * @param \Staudenmeir\EloquentHasManyDeep\Eloquent\CompositeKey|array|string $foreignKey
20
     * @param \Staudenmeir\EloquentHasManyDeep\Eloquent\CompositeKey|array|string $localKey
21
     * @param string $prefix
22
     * @return void
23
     */
24 73
    protected function joinThroughParent(Builder $query, Model $throughParent, Model $predecessor, $foreignKey, $localKey, $prefix)
25
    {
26 73
        $joins = $this->getThroughParentsJoin($query, $throughParent, $predecessor, $foreignKey, $localKey);
27
28 73
        foreach ($joins as $i => [$first, $second]) {
29 73
            $joins[$i] = [
30 73
                $throughParent->qualifyColumn($first),
31 73
                $predecessor->qualifyColumn($prefix.$second),
32
            ];
33
        }
34
35 73
        $query->join(
36 73
            $throughParent->getTable(),
37 73
            function (JoinClause $join) use ($joins) {
38 73
                foreach ($joins as [$first, $second]) {
39 73
                    $join->on($first, '=', $second);
40
                }
41
            }
42
        );
43
44 73
        if ($this->throughParentInstanceSoftDeletes($throughParent)) {
45 41
            $column= $throughParent->getQualifiedDeletedAtColumn();
46
47 41
            $query->withGlobalScope(__CLASS__ . ":$column", function (Builder $query) use ($column) {
48 35
                $query->whereNull($column);
49
            });
50
        }
51
    }
52
53
    /**
54
     * Get the joins for a through parent table.
55
     *
56
     * @param \Illuminate\Database\Eloquent\Builder $query
57
     * @param \Illuminate\Database\Eloquent\Model $throughParent
58
     * @param \Illuminate\Database\Eloquent\Model $predecessor
59
     * @param \Staudenmeir\EloquentHasManyDeep\Eloquent\CompositeKey|array|string $foreignKey
60
     * @param \Staudenmeir\EloquentHasManyDeep\Eloquent\CompositeKey|array|string $localKey
61
     * @return array
62
     */
63 73
    protected function getThroughParentsJoin(Builder $query, Model $throughParent, Model $predecessor, $foreignKey, $localKey): array
64
    {
65 73
        $joins = [];
66
67 73
        if ($localKey instanceof CompositeKey) {
68 5
            foreach ($localKey->columns as $i => $column) {
69 5
                $joins[] = [$column, $foreignKey->columns[$i]];
70
            }
71
        } else {
72 68
            if (is_array($localKey)) {
73 5
                $query->where($throughParent->qualifyColumn($localKey[0]), '=', $predecessor->getMorphClass());
74
75 5
                $localKey = $localKey[1];
76
            }
77
78 68
            if (is_array($foreignKey)) {
79 5
                $query->where($predecessor->qualifyColumn($foreignKey[0]), '=', $throughParent->getMorphClass());
80
81 5
                $foreignKey = $foreignKey[1];
82
            }
83
84 68
            $joins[] = [$localKey, $foreignKey];
85
        }
86
87 73
        return $joins;
88
    }
89
90
    /**
91
     * Determine whether a "through" parent instance of the relation uses SoftDeletes.
92
     *
93
     * @param \Illuminate\Database\Eloquent\Model $instance
94
     * @return bool
95
     */
96 73
    public function throughParentInstanceSoftDeletes(Model $instance)
97
    {
98 73
        return in_array(SoftDeletes::class, class_uses_recursive($instance));
99
    }
100
}
101