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 Builder $query * @param string $search * @param array $fields * @return 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 Builder $query * @param array $ignore * @return 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); } if (request()->sort_way) { Session::put("$rName.sort_way", request()->sort_way); } if (request()->rst) { 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; } // Front Search methods. /** * Get product query search * * Par leur désignation * Par espèce * Par gamme * Par ingrédients * Par atout produits * Par type produit * * @param string $search * @return \Illuminate\Database\Eloquent\Builder */ protected function getProductQuery(string $search): Builder { return Product::query()->where('status', true)->where(function ($query) use ($search) { // Par leur désignation. $query->where('label', 'like', "%{$search}%"); // Par ingrédients. $query->orWhere('ingredients', 'like', "%{$search}%"); // Par atout produits. $query->orWhere('advantage', 'like', "%{$search}%"); // Par gamme. $query->orWhereHas('subrange', function (Builder $q) use ($search) { $q->whereHas('range', function (Builder $q) use ($search) { $q->where('label', 'like', "%{$search}%"); }); }); // Par type de produit (sous gamme). $query->orWhereHas('subrange', function (Builder $q) use ($search) { $q->where('label', 'like', "%{$search}%"); }); // Par espèce. if (\strlen($search)) { /** @var \App\Enums\Products\ProductSpeciesEnum|null $specie */ $specie = \collect(ProductSpeciesEnum::toArray()) ->filter(function (ProductSpeciesEnum $specie) use ($search) { return \strpos(Str::lower($specie->label), Str::lower($search)) !== false; })->first(); if ($specie) { $query->orWhere('species', $specie); } } }); } /** * Get news query search * * Par mots dans le titre * Par mots dans le texte * * @param string $search * @return \Illuminate\Database\Eloquent\Builder */ protected function getNewsQuery(string $search): Builder { return News::query()->where('status', true)->where(function ($query) use ($search) { $query->where('title', 'like', "%{$search}%"); $query->orWhere('subtitle', 'like', "%{$search}%"); $query->orWhere('content', 'like', "%{$search}%"); $query->orWhere('content2', 'like', "%{$search}%"); }); } /** * Get recipe query search * * Par mots dans le titre * Par mots dans le texte de la recette * * @param string $search * @return \Illuminate\Database\Eloquent\Builder */ protected function getRecipeQuery(string $search): Builder { return Advice::query()->where('status', true) ->where('type', '=', AdviceTypeEnum::recipes()->value) ->where(function ($query) use ($search) { $query->where('title', 'like', "%{$search}%"); $query->orWhere('preparation', 'like', "%{$search}%"); $query->orWhere('advice', 'like', "%{$search}%"); $query->orWhere('ingredients', 'like', "%{$search}%"); }); } }