237 lines
8.7 KiB
PHP
237 lines
8.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Search;
|
|
use App\Models\Product;
|
|
use App\Models\Category;
|
|
use App\Models\Brand;
|
|
use App\Models\Color;
|
|
use App\Models\Shop;
|
|
use App\Models\Attribute;
|
|
use App\Models\AttributeCategory;
|
|
use App\Utility\CategoryUtility;
|
|
|
|
class SearchController extends Controller
|
|
{
|
|
public function index(Request $request, $category_id = null, $brand_id = null)
|
|
{
|
|
$query = $request->keyword;
|
|
$sort_by = $request->sort_by;
|
|
$min_price = $request->min_price;
|
|
$max_price = $request->max_price;
|
|
$seller_id = $request->seller_id;
|
|
$attributes = Attribute::all();
|
|
$selected_attribute_values = array();
|
|
$colors = Color::all();
|
|
$selected_color = null;
|
|
|
|
$conditions = [];
|
|
|
|
if ($brand_id != null) {
|
|
$conditions = array_merge($conditions, ['brand_id' => $brand_id]);
|
|
} elseif ($request->brand != null) {
|
|
$brand_id = (Brand::where('slug', $request->brand)->first() != null) ? Brand::where('slug', $request->brand)->first()->id : null;
|
|
$conditions = array_merge($conditions, ['brand_id' => $brand_id]);
|
|
}
|
|
|
|
// if ($seller_id != null) {
|
|
// $conditions = array_merge($conditions, ['user_id' => Seller::findOrFail($seller_id)->user->id]);
|
|
// }
|
|
|
|
$products = Product::where($conditions);
|
|
|
|
if ($category_id != null) {
|
|
$category_ids = CategoryUtility::children_ids($category_id);
|
|
$category_ids[] = $category_id;
|
|
|
|
$products->whereIn('category_id', $category_ids);
|
|
|
|
$attribute_ids = AttributeCategory::whereIn('category_id', $category_ids)->pluck('attribute_id')->toArray();
|
|
$attributes = Attribute::whereIn('id', $attribute_ids)->get();
|
|
} else {
|
|
// if ($query != null) {
|
|
// foreach (explode(' ', trim($query)) as $word) {
|
|
// $ids = Category::where('name', 'like', '%'.$word.'%')->pluck('id')->toArray();
|
|
// if (count($ids) > 0) {
|
|
// foreach ($ids as $id) {
|
|
// $category_ids[] = $id;
|
|
// array_merge($category_ids, CategoryUtility::children_ids($id));
|
|
// }
|
|
// }
|
|
// }
|
|
// $attribute_ids = AttributeCategory::whereIn('category_id', $category_ids)->pluck('attribute_id')->toArray();
|
|
// $attributes = Attribute::whereIn('id', $attribute_ids)->get();
|
|
// }
|
|
}
|
|
|
|
if ($min_price != null && $max_price != null) {
|
|
$products->where('unit_price', '>=', $min_price)->where('unit_price', '<=', $max_price);
|
|
}
|
|
|
|
if ($query != null) {
|
|
$searchController = new SearchController;
|
|
$searchController->store($request);
|
|
|
|
$products->where(function ($q) use ($query) {
|
|
foreach (explode(' ', trim($query)) as $word) {
|
|
$q->where('name', 'like', '%' . $word . '%')
|
|
->orWhere('tags', 'like', '%' . $word . '%')
|
|
->orWhereHas('product_translations', function ($q) use ($word) {
|
|
$q->where('name', 'like', '%' . $word . '%');
|
|
})
|
|
->orWhereHas('stocks', function ($q) use ($word) {
|
|
$q->where('sku', 'like', '%' . $word . '%');
|
|
});
|
|
}
|
|
});
|
|
|
|
$case1 = $query . '%';
|
|
$case2 = '%' . $query . '%';
|
|
|
|
$products->orderByRaw("CASE
|
|
WHEN name LIKE '$case1' THEN 1
|
|
WHEN name LIKE '$case2' THEN 2
|
|
ELSE 3
|
|
END");
|
|
}
|
|
|
|
switch ($sort_by) {
|
|
case 'newest':
|
|
$products->orderBy('created_at', 'desc');
|
|
break;
|
|
case 'oldest':
|
|
$products->orderBy('created_at', 'asc');
|
|
break;
|
|
case 'price-asc':
|
|
$products->orderBy('unit_price', 'asc');
|
|
break;
|
|
case 'price-desc':
|
|
$products->orderBy('unit_price', 'desc');
|
|
break;
|
|
default:
|
|
$products->orderBy('id', 'desc');
|
|
break;
|
|
}
|
|
|
|
if ($request->has('color')) {
|
|
$str = '"' . $request->color . '"';
|
|
$products->where('colors', 'like', '%' . $str . '%');
|
|
$selected_color = $request->color;
|
|
}
|
|
|
|
if ($request->has('selected_attribute_values')) {
|
|
$selected_attribute_values = $request->selected_attribute_values;
|
|
$products->where(function ($query) use ($selected_attribute_values) {
|
|
foreach ($selected_attribute_values as $key => $value) {
|
|
$str = '"' . $value . '"';
|
|
|
|
$query->orWhere('choice_options', 'like', '%' . $str . '%');
|
|
}
|
|
});
|
|
}
|
|
|
|
$products = filter_products($products)->with('taxes')->paginate(24)->appends(request()->query());
|
|
|
|
return view('frontend.product_listing', compact('products', 'query', 'category_id', 'brand_id', 'sort_by', 'seller_id', 'min_price', 'max_price', 'attributes', 'selected_attribute_values', 'colors', 'selected_color'));
|
|
}
|
|
|
|
public function listing(Request $request)
|
|
{
|
|
return $this->index($request);
|
|
}
|
|
|
|
public function listingByCategory(Request $request, $category_slug)
|
|
{
|
|
$category = Category::where('slug', $category_slug)->first();
|
|
if ($category != null) {
|
|
return $this->index($request, $category->id);
|
|
}
|
|
abort(404);
|
|
}
|
|
|
|
public function listingByBrand(Request $request, $brand_slug)
|
|
{
|
|
$brand = Brand::where('slug', $brand_slug)->first();
|
|
if ($brand != null) {
|
|
return $this->index($request, null, $brand->id);
|
|
}
|
|
abort(404);
|
|
}
|
|
|
|
//Suggestional Search
|
|
public function ajax_search(Request $request)
|
|
{
|
|
$keywords = array();
|
|
$query = $request->search;
|
|
$products = Product::where('published', 1)->where('tags', 'like', '%' . $query . '%')->get();
|
|
foreach ($products as $key => $product) {
|
|
foreach (explode(',', $product->tags) as $key => $tag) {
|
|
if (stripos($tag, $query) !== false) {
|
|
if (sizeof($keywords) > 5) {
|
|
break;
|
|
} else {
|
|
if (!in_array(strtolower($tag), $keywords)) {
|
|
array_push($keywords, strtolower($tag));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$products_query = filter_products(Product::query());
|
|
|
|
$products_query = $products_query->where('published', 1)
|
|
->where(function ($q) use ($query) {
|
|
foreach (explode(' ', trim($query)) as $word) {
|
|
$q->where('name', 'like', '%' . $word . '%')
|
|
->orWhere('tags', 'like', '%' . $word . '%')
|
|
->orWhereHas('product_translations', function ($q) use ($word) {
|
|
$q->where('name', 'like', '%' . $word . '%');
|
|
})
|
|
->orWhereHas('stocks', function ($q) use ($word) {
|
|
$q->where('sku', 'like', '%' . $word . '%');
|
|
});
|
|
}
|
|
});
|
|
$case1 = $query . '%';
|
|
$case2 = '%' . $query . '%';
|
|
|
|
$products_query->orderByRaw("CASE
|
|
WHEN name LIKE '$case1' THEN 1
|
|
WHEN name LIKE '$case2' THEN 2
|
|
ELSE 3
|
|
END");
|
|
$products = $products_query->limit(3)->get();
|
|
|
|
$categories = Category::where('name', 'like', '%' . $query . '%')->get()->take(3);
|
|
|
|
$shops = Shop::whereIn('user_id', verified_sellers_id())->where('name', 'like', '%' . $query . '%')->get()->take(3);
|
|
|
|
if (sizeof($keywords) > 0 || sizeof($categories) > 0 || sizeof($products) > 0 || sizeof($shops) > 0) {
|
|
return view('frontend.partials.search_content', compact('products', 'categories', 'keywords', 'shops'));
|
|
}
|
|
return '0';
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$search = Search::where('query', $request->keyword)->first();
|
|
if ($search != null) {
|
|
$search->count = $search->count + 1;
|
|
$search->save();
|
|
} else {
|
|
$search = new Search;
|
|
$search->query = $request->keyword;
|
|
$search->save();
|
|
}
|
|
}
|
|
}
|