first upload all files
This commit is contained in:
74
Modules/Product/Http/Controllers/ProductSearch.php
Normal file
74
Modules/Product/Http/Controllers/ProductSearch.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Product\Http\Controllers;
|
||||
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Product\Entities\Product;
|
||||
use Modules\Category\Entities\Category;
|
||||
use Modules\Attribute\Entities\Attribute;
|
||||
use Modules\Product\Filters\ProductFilter;
|
||||
use Modules\Product\Events\ShowingProductList;
|
||||
|
||||
trait ProductSearch
|
||||
{
|
||||
/**
|
||||
* Search products for the request.
|
||||
*
|
||||
* @param \Modules\Product\Entities\Product $model
|
||||
* @param \Modules\Product\Filters\ProductFilter $productFilter
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function searchProducts(Product $model, ProductFilter $productFilter)
|
||||
{
|
||||
$productIds = [];
|
||||
|
||||
if (request()->filled('query')) {
|
||||
$model = $model->search(request('query'));
|
||||
$productIds = $model->keys();
|
||||
}
|
||||
|
||||
$query = $model->filter($productFilter);
|
||||
|
||||
if (request()->filled('category')) {
|
||||
$productIds = (clone $query)->select('products.id')->resetOrders()->pluck('id');
|
||||
}
|
||||
|
||||
$products = $query->paginate(request('perPage', 30));
|
||||
|
||||
event(new ShowingProductList($products));
|
||||
|
||||
return response()->json([
|
||||
'products' => $products,
|
||||
'attributes' => $this->getAttributes($productIds),
|
||||
]);
|
||||
}
|
||||
|
||||
private function getAttributes($productIds)
|
||||
{
|
||||
if (! request()->filled('category') || $this->filteringViaRootCategory()) {
|
||||
return collect();
|
||||
}
|
||||
|
||||
return Attribute::with('values')
|
||||
->where('is_filterable', true)
|
||||
->whereHas('categories', function ($query) use ($productIds) {
|
||||
$query->whereIn('id', $this->getProductsCategoryIds($productIds));
|
||||
})
|
||||
->get();
|
||||
}
|
||||
|
||||
private function filteringViaRootCategory()
|
||||
{
|
||||
return Category::where('slug', request('category'))
|
||||
->firstOrNew([])
|
||||
->isRoot();
|
||||
}
|
||||
|
||||
private function getProductsCategoryIds($productIds)
|
||||
{
|
||||
return DB::table('product_categories')
|
||||
->whereIn('product_id', $productIds)
|
||||
->distinct()
|
||||
->pluck('category_id');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user