ldc-le-gaulois-pro/app/Http/Controllers/Fo/SearchController.php
2023-01-11 10:05:49 +00:00

122 lines
4.5 KiB
PHP

<?php
namespace App\Http\Controllers\Fo;
use App\Enums\Advices\AdviceTypeEnum;
use App\Http\Controllers\Controller;
use App\Models\Advice;
use App\Models\News;
use App\Models\Product;
use Illuminate\Http\Request;
class SearchController extends Controller
{
/**
* Search input txt in products, articles and recipes
*
* @param Request $request
* @return \Illuminate\Http\Response
*/
public function search(Request $request)
{
$filter = $request->query('search') ?? '';
$model = $request->query('model');
$products = [];
$articles = [];
$recipes = [];
if (is_array($filter)) {
abort(400);
}
if (is_string($model)) {
return $this->callAction('searchModel', [$model, $filter]);
}
$products = Product::where('status', true)
->where(function ($query) use ($filter) {
$query->where('label', 'like', '%' . $filter . '%');
$query->orWhere('ingredients', 'like', '%' . $filter . '%');
$query->orWhere('advantage', 'like', '%' . $filter . '%');
$query->orWhere('preparation', 'like', '%' . $filter . '%');
})
->limit(3)
->get();
$news = News::where('status', true)
->where(function ($query) use ($filter) {
$query->where('title', 'like', '%' . $filter . '%');
$query->orWhere('subtitle', 'like', '%' . $filter . '%');
$query->orWhere('content', 'like', '%' . $filter . '%');
$query->orWhere('content2', 'like', '%' . $filter . '%');
})
->with('categories')
->limit(3)
->get();
$recipes = Advice::where('status', true)
->where('type', '=', AdviceTypeEnum::recipes()->value)
->where(function ($query) use ($filter) {
$query->where('title', 'like', '%' . $filter . '%');
$query->orWhere('preparation', 'like', '%' . $filter . '%');
$query->orWhere('advice', 'like', '%' . $filter . '%');
$query->orWhere('ingredients', 'like', '%' . $filter . '%');
})
->with(['tags'])
->limit(3)
->get();
return view('fo.pages.search-list', compact('products', 'news', 'recipes'));
}
/**
* Undocumented function
*
* @param string $name
* @param string $filter
* @return \Illuminate\Http\Response
*/
public function searchModel(string $name, string $filter)
{
$models = [];
switch ($name) {
case 'product':
$models = Product::where('status', true)
->where(function ($query) use ($filter) {
$query->where('label', 'like', '%' . $filter . '%');
$query->orWhere('ingredients', 'like', '%' . $filter . '%');
$query->orWhere('advantage', 'like', '%' . $filter . '%');
$query->orWhere('preparation', 'like', '%' . $filter . '%');
})
->paginate(6);
break;
case 'news':
$models = News::where('status', true)
->where(function ($query) use ($filter) {
$query->where('title', 'like', '%' . $filter . '%');
$query->orWhere('subtitle', 'like', '%' . $filter . '%');
$query->orWhere('content', 'like', '%' . $filter . '%');
$query->orWhere('content2', 'like', '%' . $filter . '%');
})
->with('categories')
->paginate(6);
break;
case 'recipe':
$models = Advice::where('status', true)
->where('type', '=', AdviceTypeEnum::recipes()->value)
->where(function ($query) use ($filter) {
$query->where('title', 'like', '%' . $filter . '%');
$query->orWhere('preparation', 'like', '%' . $filter . '%');
$query->orWhere('advice', 'like', '%' . $filter . '%');
$query->orWhere('ingredients', 'like', '%' . $filter . '%');
})
->with(['tags'])
->paginate(6);
break;
default:
abort(400);
} //end switch
return view('fo.pages.search', compact('name', 'models'));
}
}