EmptyFieldFilter::setColumn()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace NovaThinKit\Nova\Filters;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Laravel\Nova\Filters\BooleanFilter;
7
use Laravel\Nova\Http\Requests\NovaRequest;
8
9
class EmptyFieldFilter extends BooleanFilter
10
{
11
    protected string $columnName;
12
13 3
    public function __construct(string $columnName, string $name = null)
14
    {
15 3
        $this->setColumn($columnName);
16 3
        if ($name) {
17 2
            $this->setName($name);
18
        }
19
    }
20
21 2
    public function apply(NovaRequest $request, $query, $value)
22
    {
23 2
        if (($value['empty'] ?? false) && ($value['filled'] ?? false)) {
24 2
            return $query;
25
        }
26
27 2
        $relations  = explode('.', $this->columnName);
28 2
        $columnName = array_pop($relations);
29
30 2
        $callback = function ($query) use ($value, $columnName) {
31 2
            if ($value['empty']) {
32 2
                $query->whereNull($columnName)
33 2
                    ->orWhere($columnName, '');
34 2
            } elseif ($value['filled']) {
35 2
                $query->whereNotNull($columnName)
36 2
                    ->where($columnName, '<>', '');
37
            }
38 2
        };
39
40 2
        $this->recursiveCallback($query, $relations, $callback);
41
42 2
        return $query;
43
    }
44
45 1
    public function options(NovaRequest $request): array
46
    {
47 1
        return [
48 1
            trans('nova-thinkit::filter.nullable-field.empty')  => 'empty',
49 1
            trans('nova-thinkit::filter.nullable-field.filled') => 'filled',
50 1
        ];
51
    }
52
53
54 2
    public function setName(string $name): self
55
    {
56 2
        $this->name = $name;
57
58 2
        return $this;
59
    }
60
61 3
    public function setColumn(string $columnName): self
62
    {
63 3
        $this->columnName = $columnName;
64
65 3
        return $this;
66
    }
67
68 2
    protected function recursiveCallback(Builder $query, array $relations, \Closure $callback): void
69
    {
70 2
        if (count($relations)) {
71 1
            $relation = array_shift($relations);
72 1
            $query->whereHas($relation, fn ($q) => $this->recursiveCallback($q, $relations, $callback))
73 1
                ->orDoesntHave($relation);
74
        } else {
75 2
            $callback($query);
76
        }
77
    }
78
}
79