Passed
Push — master ( 7b0e09...9f2c91 )
by Stephen
52s queued 12s
created

HasFilter::apply()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Sfneal\Filters;
4
5
use Illuminate\Database\Eloquent\Builder;
6
7
// todo: add tests once test data package is complete
8
class HasFilter implements Filter
9
{
10
    /**
11
     * Scope query results to models WITH particular relationships.
12
     *
13
     *  - useful for checkbox search inputs corresponding to relationship names
14
     *
15
     * @param Builder $query
16
     * @param array|mixed $value
17
     * @return Builder $builder
18
     */
19
    public function apply(Builder $query, $value): Builder
20
    {
21
        return self::execute($query, $value);
22
    }
23
24
    /**
25
     * Apply the Filter to the Query.
26
     *
27
     * @param Builder $query
28
     * @param array $value
29
     * @param bool $has
30
     * @return Builder
31
     */
32
    protected static function execute(Builder $query, array $value, bool $has = true): Builder
33
    {
34
        // use `has()` method for scoping to models WITH particular relationships
35
        // use `doesntHave()` method for scoping to models WITHOUT particular relationships
36
        $method = $has ? 'has' : 'doesntHave';
37
38
        // Add scope for each relationship
39
        foreach (array_keys((array) $value) as $relationship) {
40
            $query->{$method}($relationship);
41
        }
42
43
        return $query;
44
    }
45
}
46