where(function ($query) use ($searchQuery, $words, $search, $fields) { foreach ($words as $word) { if (!strlen($word)) { continue; } $this->searchOnFields($query, $word, $fields); } //end foreach // Search whole using whole sentence. $this->searchOnFields($query, $search, $fields); if ($searchQuery) { $searchQuery($query); } }); } //end if return $query; } /** * Build query search on all fields * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $search * @param array $fields * @return \Illuminate\Database\Eloquent\Builder */ private function searchOnFields(Builder $query, string $search, array $fields): Builder { $table = $query->getModel()->getTable(); foreach ($fields as $f) { $f = str_replace('?', '\?', $f); if (is_array($f)) { $query->orWhereRaw( sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($f)->map(function ($q) use ($table) { return "`$table`.`$q`"; })->implode(', \' \', ')), ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] ); } else { $query->orWhereRaw( "UPPER(`$table`.`$f`) LIKE UPPER(?)", ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] ); } } return $query; } /** * Sort columns with a query * * @param \Illuminate\Database\Eloquent\Builder $query * @param array $ignore * @return \Illuminate\Database\Eloquent\Builder */ protected function sortQuery(Builder $query, array $ignore = []): Builder { $rName = request()->route()->getName(); $table = $query->getModel()->getTable(); if (request()->sort_col) { Session::put("$rName.sort_col", request()->sort_col); Session::put("$rName.sorted", true); } if (request()->sort_way) { Session::put("$rName.sort_way", request()->sort_way); Session::put("$rName.sorted", true); } if (request()->rst) { Session::remove("$rName.sorted"); Session::remove("$rName.sort_col"); Session::remove("$rName.sort_way"); } if (request()->sort_col and request()->sort_way and Schema::hasColumn($table, request()->sort_col)) { if ( !isset($ignore) or (isset($ignore) and !in_array(request()->sort_col, $ignore)) ) { $query = $query->orderBy(\sprintf("$table.%s", request()->sort_col), request()->sort_way); } } elseif (Schema::hasColumn($table, 'order')) { $query = $query->orderBy('order', 'ASC'); Session::put("$rName.sort_col", 'order'); Session::put("$rName.sort_way", 'asc'); } return $query; } /** * Customize pagination with cache or config (default). * * @param \Illuminate\Database\Eloquent\Builder $query * @param \App\Enums\Pagination\ItemsPerPaginationEnum|null $pagination * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator */ protected function paginate(Builder $query, ItemsPerPaginationEnum $pagination = null): LengthAwarePaginator { $currentRoutePath = Str::slug(request()->route()->getName()); $cacheKey = "pagination.{$currentRoutePath}"; $pagination = $pagination ?? ItemsPerPaginationEnum::twelve->value; $pagination = ToolboxHelper::getValidatedPaginate( Cache::get($cacheKey, $pagination) ); if (Cache::get($cacheKey) !== $pagination) { Cache::put($cacheKey, $pagination); } $query = $query->paginate($pagination); return $query; } }