Passed
Pull Request — 1.0.0-release (#16)
by Alex
02:46
created

QueriesResources::sortQuery()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 6
nc 3
nop 2
1
<?php
2
3
namespace Huntie\JsonApi\Http\Concerns;
4
5
use Schema;
6
7
trait QueriesResources
8
{
9
    /**
10
     * Sort a resource query by one or more attributes.
11
     *
12
     * @param \Illuminate\Database\Eloquent\Builder $query
13
     * @param array                                 $attributes
14
     *
15
     * @return \Illuminate\Database\Eloquent\Builder
16
     */
17
    protected function sortQuery($query, array $attributes)
18
    {
19
        foreach ($attributes as $expression) {
20
            $direction = substr($expression, 0, 1) === '-' ? 'desc' : 'asc';
21
            $column = preg_replace('/^\-/', '', $expression);
22
            $query = $query->orderBy($column, $direction);
23
        }
24
25
        return $query;
26
    }
27
28
    /**
29
     * Filter a resource query by one or more attributes.
30
     *
31
     * @param \Illuminate\Database\Eloquent\Builder $query
32
     * @param array                                 $attributes
33
     *
34
     * @return \Illuminate\Database\Eloquent\Builder
35
     */
36
    protected function filterQuery($query, array $attributes)
37
    {
38
        $searchableColumns = array_diff(
39
            Schema::getColumnListing($query->getModel()->getTable()),
40
            $query->getModel()->getHidden()
41
        );
42
43
        foreach (array_intersect_key($attributes, array_flip($searchableColumns)) as $column => $value) {
44
            if (is_numeric($value)) {
45
                // Exact numeric match
46
                $query = $query->where($column, $value);
47
            } else if (in_array(strtolower($value), ['true', 'false'])) {
48
                // Boolean match
49
                $query = $query->where($column, filter_var($value, FILTER_VALIDATE_BOOLEAN));
50
            } else {
51
                // Partial string match
52
                $query = $query->where($column, 'LIKE', '%' . $value . '%');
53
            }
54
        }
55
56
        return $query;
57
    }
58
}
59