Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
n/a
0 / 0
n/a
0 / 0
CRAP
n/a
0 / 0
Controller
n/a
0 / 0
n/a
0 / 0
19
n/a
0 / 0
 searchQuery
n/a
0 / 0
n/a
0 / 0
5
 searchOnFields
n/a
0 / 0
n/a
0 / 0
3
 sortQuery
n/a
0 / 0
n/a
0 / 0
11
1<?php
2
3namespace App\Http\Controllers;
4
5use Illuminate\Database\Eloquent\Builder;
6use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
7use Illuminate\Foundation\Bus\DispatchesJobs;
8use Illuminate\Foundation\Validation\ValidatesRequests;
9use Illuminate\Routing\Controller as BaseController;
10use Illuminate\Support\Facades\Schema;
11use Illuminate\Support\Facades\Session;
12
13/**
14 * @codeCoverageIgnore
15 */
16class Controller extends BaseController
17{
18    use AuthorizesRequests;
19    use DispatchesJobs;
20    use ValidatesRequests;
21
22    /**
23     * Build Search query on specified fields
24     * splitting search into words or using whole sentence
25     *
26     * @param \Illuminate\Database\Eloquent\Builder $query       The eloquent query builder.
27     * @param string                                $search      The query string.
28     * @param callable                              $searchQuery The query string.
29     * @param string                                ...$fields   Either a simple array or a string
30     *                                                           in case of a string the two fields
31     *                                                           would be concatenate to make the search.
32     * @return \Illuminate\Database\Eloquent\Builder
33     */
34    protected function searchQuery(
35        Builder $query,
36        string $search,
37        callable $searchQuery = null,
38        string ...$fields
39    ): Builder {
40        if (count($fields)) {
41            // Search using words.
42            $words = explode(' ', $search);
43            $query->where(function ($query) use ($searchQuery, $words, $search, $fields) {
44                foreach ($words as $word) {
45                    if (!strlen($word)) {
46                        continue;
47                    }
48                    $this->searchOnFields($query, $word, $fields);
49                } //end foreach
50                // Search whole using whole sentence.
51                $this->searchOnFields($query, $search, $fields);
52                if ($searchQuery) {
53                    $searchQuery($query);
54                }
55            });
56        } //end if
57        return $query;
58    }
59
60    /**
61     * Build query search on all fields
62     *
63     * @param \Illuminate\Database\Eloquent\Builder $query
64     * @param string                                $search
65     * @param array                                 $fields
66     * @return \Illuminate\Database\Eloquent\Builder
67     */
68    private function searchOnFields(Builder $query, string $search, array $fields): Builder
69    {
70        $table = $query->getModel()->getTable();
71        foreach ($fields as $f) {
72            $f = str_replace('?', '\?', $f);
73            if (is_array($f)) {
74                $query->orWhereRaw(
75                    sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($f)->map(function ($q) use ($table) {
76                        return "`$table`.`$q`";
77                    })->implode(', \' \', ')),
78                    ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%']
79                );
80            } else {
81                $query->orWhereRaw(
82                    "UPPER(`$table`.`$f`) LIKE UPPER(?)",
83                    ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%']
84                );
85            }
86        }
87        return $query;
88    }
89
90    /**
91     * Sort columns with a query
92     *
93     * @param \Illuminate\Database\Eloquent\Builder $query
94     * @param array                                 $ignore
95     * @return \Illuminate\Database\Eloquent\Builder
96     */
97    protected function sortQuery(Builder $query, array $ignore = []): Builder
98    {
99        $rName = request()->route()->getName();
100        $table = $query->getModel()->getTable();
101        if (request()->sort_col) {
102            Session::put("$rName.sort_col", request()->sort_col);
103            Session::put("$rName.sorted", true);
104        }
105        if (request()->sort_way) {
106            Session::put("$rName.sort_way", request()->sort_way);
107            Session::put("$rName.sorted", true);
108        }
109        if (request()->rst) {
110            Session::remove("$rName.sorted");
111            Session::remove("$rName.sort_col");
112            Session::remove("$rName.sort_way");
113        }
114        if (request()->sort_col and request()->sort_way and Schema::hasColumn($table, request()->sort_col)) {
115            if (
116                !isset($ignore) or
117                (isset($ignore) and !in_array(request()->sort_col, $ignore))
118            ) {
119                $query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way);
120            }
121        } elseif (Schema::hasColumn($table, 'order')) {
122            $query = $query->orderBy('order', 'ASC');
123            Session::put("$rName.sort_col", 'order');
124            Session::put("$rName.sort_way", 'asc');
125        }
126        return $query;
127    }
128}