Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Controller
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 3
380
0.00% covered (danger)
0.00%
0 / 1
 searchQuery
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
30
 searchOnFields
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
12
 sortQuery
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
132
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
13class Controller extends BaseController
14{
15    use AuthorizesRequests;
16    use DispatchesJobs;
17    use ValidatesRequests;
18
19    /**
20     * Build Search query on specified fields
21     * splitting search into words or using whole sentence.
22     *
23     * @param \Illuminate\Database\Eloquent\Builder $query       The eloquent query builder.
24     * @param string                                $search      The query string.
25     * @param callable                              $searchQuery The query string.
26     * @param string                                ...$fields   Either a simple array or a string
27     *                                                           in case of a string the two fields
28     *                                                           would be concatenate to make the search.
29     * @return \Illuminate\Database\Eloquent\Builder
30     */
31    protected function searchQuery(
32        Builder $query,
33        string $search,
34        callable $searchQuery = null,
35        string ...$fields
36    ): \Illuminate\Database\Eloquent\Builder {
37        if (count($fields)) {
38            // Search using words.
39            $words = explode(' ', $search);
40            $query->where(function ($query) use ($searchQuery, $words, $search, $fields) {
41                foreach ($words as $word) {
42                    if (!strlen($word)) {
43                        continue;
44                    }
45                    $this->searchOnFields($query, $word, $fields);
46                } //end foreach
47                // Search whole using whole sentence.
48                $this->searchOnFields($query, $search, $fields);
49                if ($searchQuery) {
50                    $searchQuery($query);
51                }
52            });
53        } //end if
54        return $query;
55    }
56
57    /**
58     * Build query search on all fields.
59     *
60     * @param \Illuminate\Database\Eloquent\Builder $query
61     * @param string                                $search
62     * @param array                                 $fields
63     * @return \Illuminate\Database\Eloquent\Builder
64     */
65    private function searchOnFields(
66        Builder $query,
67        string $search,
68        array $fields
69    ): \Illuminate\Database\Eloquent\Builder {
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 = []): \Illuminate\Database\Eloquent\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}