Completed
Push — master ( 187043...48cde4 )
by
unknown
01:30
created

src/Concerns/SortsQuery.php (3 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Spatie\QueryBuilder\Concerns;
4
5
use Spatie\QueryBuilder\AllowedSort;
6
use Spatie\QueryBuilder\Exceptions\InvalidSortQuery;
7
8
trait SortsQuery
9
{
10
    /** @var \Illuminate\Support\Collection */
11
    protected $allowedSorts;
12
13
    public function allowedSorts($sorts): self
14
    {
15
        if ($this->request->sorts()->isEmpty()) {
0 ignored issues
show
The property request does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
16
            // We haven't got any requested sorts. No need to parse allowed sorts.
17
18
            return $this;
19
        }
20
21
        $sorts = is_array($sorts) ? $sorts : func_get_args();
22
23
        $this->allowedSorts = collect($sorts)->map(function ($sort) {
24
            if ($sort instanceof AllowedSort) {
25
                return $sort;
26
            }
27
28
            return AllowedSort::field(ltrim($sort, '-'));
29
        });
30
31
        if ($this->ensureAllSortsExist()) {
32
            $this->addRequestedSortsToQuery(); // allowed is known & request is known, add what we can, if there is no request, -wait
33
        }
34
35
        return $this;
36
    }
37
38
    /**
39
     * @param array|string|\Spatie\QueryBuilder\AllowedSort $sorts
40
     *
41
     * @return \Spatie\QueryBuilder\QueryBuilder
42
     */
43
    public function defaultSort($sorts): self
0 ignored issues
show
The parameter $sorts is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
44
    {
45
        return $this->defaultSorts(func_get_args());
46
    }
47
48
    /**
49
     * @param array|string|\Spatie\QueryBuilder\AllowedSort $sorts
50
     *
51
     * @return \Spatie\QueryBuilder\QueryBuilder
52
     */
53
    public function defaultSorts($sorts): self
54
    {
55
        if ($this->request->sorts()->isNotEmpty()) {
56
            // We've got requested sorts. No need to parse defaults.
57
58
            return $this;
59
        }
60
61
        $sorts = is_array($sorts) ? $sorts : func_get_args();
62
63
        collect($sorts)
64
            ->map(function ($sort) {
65
                if ($sort instanceof AllowedSort) {
66
                    return $sort;
67
                }
68
69
                return AllowedSort::field($sort);
70
            })
71
            ->each(function (AllowedSort $sort) {
72
                $sort->sort($this);
73
            });
74
75
        return $this;
76
    }
77
78
    protected function addRequestedSortsToQuery()
79
    {
80
        $this->request->sorts()
81
            ->each(function (string $property) {
82
                $descending = $property[0] === '-';
83
84
                $key = ltrim($property, '-');
85
86
                $sort = $this->findSort($key);
87
88
                $sort->sort($this, $descending);
89
            });
90
    }
91
92
    protected function findSort(string $property): ?AllowedSort
93
    {
94
        return $this->allowedSorts
95
            ->first(function (AllowedSort $sort) use ($property) {
96
                return $sort->isSort($property);
97
            });
98
    }
99
100
    protected function ensureAllSortsExist(): bool
101
    {
102
        $requestedSortNames = $this->request->sorts()->map(function (string $sort) {
103
            return ltrim($sort, '-');
104
        });
105
106
        $allowedSortNames = $this->allowedSorts->map(function (AllowedSort $sort) {
107
            return $sort->getName();
108
        });
109
110
        $unknownSorts = $requestedSortNames->diff($allowedSortNames);
111
112
        if ($unknownSorts->isNotEmpty()) {
113
            if ($this->throwInvalidQueryExceptions) {
0 ignored issues
show
The property throwInvalidQueryExceptions does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
114
                throw InvalidSortQuery::sortsNotAllowed($unknownSorts, $allowedSortNames);
115
            } else {
116
                return false;
117
            }
118
        }
119
120
        return true;
121
    }
122
}
123