Files
getgreen-backend/app/Queries/Category.php

256 lines
8.3 KiB
PHP
Executable File

<?php
namespace App\Queries;
use App\Models\Category as Model;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class Category
{
/**
* @return mixed
*/
public function getCurrentCategories()
{
return Model::orderBy('position', 'asc')
->whereNull('parent_id')
->get();
}
/**
* @param $category
* @return array
*/
public function getCategoriesAndCategoryId($category)
{
$categories = $category->parents()->select('id', 'name', 'parent_id', 'slug', 'published')
->with('parent:id,name,slug,parent_id,published', 'parent.parent:id,name,slug,parent_id,published')
->get();
$categories->map(function ($category) {
$category->link = route('category.showParent', [$category->parent->parent->slug, $category->parent->slug, $category->slug]);
return $category;
});
$category_id = $categories->map(function ($category) {
return $category->id;
});
$category_id = array_merge($category_id->toArray(), [$category->id]);
return [$categories, $category_id];
}
public function getCategoriesAndCategoryMainId($category)
{
$categories = $category->parents->map(function ($category) {
$category->link = route('category.show', [$category->parent->slug, $category->slug]);
return $category;
});
$category_id = $category->parents->map(function ($category) {
$categories = [];
if ($category->parents) {
$categories[] = $category->parents->map(function ($parent) {
return $parent->id;
});
}
$categories[] = $category->id;
return $categories;
})->flatten(2);
$category_id = array_merge($category_id->toArray(), [$category->id]);
return [$categories, $category_id];
}
/**
* @param $category_id
* @return mixed
*/
public function getProductsFromCategoryId($category_id)
{
$products = Product::select('id', 'name', 'poster_thumb', 'price', 'price_discount', 'popular', 'slug', 'leader_of_sales', 'currency', 'available', 'count')
->when($category_id ?? [], function ($query, $category_id) {
$query->whereHas('categories', function ($query) use ($category_id) {
$query->whereIn('id', $category_id);
});
})
->with('children:id,child_id')
->whereHas('children')
->orderBy('id', 'desc')
->published()
->paginate(12);
$products->map(function ($product) {
$product->categories->map(function ($category) {
if ($category->parent) {
if ($category->parent->parent) {
$category->link = route('category.showParent', [$category->parent->parent->slug, $category->parent->slug, $category->slug]);
} else {
$category->link = route('category.show', [$category->parent->slug, $category->slug]);
}
} else {
$category->link = route('category.view', $category->slug);
}
});
$product->price = $product->getPrice();
$product->price_discount = $product->price_discount == null ? null : $product->getDiscountPrice();
});
// $products->categories->map(function ($category) {
// $category->link = 'test.com';
// return $category;
// });
return $products;
}
/**
* @param $category
* @return mixed
*/
public function getCharacteristics($category)
{
$characteristics = $category->characteristics()->where('filter', true)->with(['values' => function ($value) {
return $value->select('value');
}])->whereHas('values', function ($query) {
$query->whereNull('deleted_at');
})->get();
$characteristics = $characteristics->map(function ($char) {
$group = $char->values->groupBy('value');
$values = [];
foreach ($group as $key => $value) {
if ($key != 'null') {
$values[] = $key;
}
}
$char->attributes = $values;
return $char;
});
$characteristics->makeHidden('values');
return $characteristics;
}
/**
* @param $category
* @return mixed
*/
public function getCategoryProducts($category)
{
$products = $category->products()
->select('id', 'name', 'poster_thumb', 'price', 'price_discount', 'popular', 'slug', 'leader_of_sales', 'currency')
->with('categories:id,name', 'children:id,child_id')
->whereHas('childrens')
->orderBy('products.id', 'desc')
->published()
->paginate(12);
$products->map(function ($product) {
$product->price = $product->getPrice();
$product->price_discount = $product->price_discount == null ? null : $product->getDiscountPrice();
});
return $products;
}
/**
* @param $category_id
* @param Request $request
* @return array
*/
public function getFilterProducts($category_id, Request $request)
{
$products = Product::select('id', 'name', 'poster_thumb', 'price', 'price_discount', 'popular', 'slug', 'leader_of_sales', 'currency', 'available', 'count')
->when($category_id ?? [], function ($query, $category_id) {
$query->whereHas('categories', function ($query) use ($category_id) {
$query->whereIn('id', $category_id);
});
})
->with('categories:id,name', 'children:id,child_id')
->whereHas('childrens')
->published();
if (count($request->filter) > 0) {
$attributes = collect($request->filter)->map(function ($filter) {
return $filter;
})->groupBy('id');
$attributes = $attributes->map(function ($attr) {
$attribute = $attr->map(function ($attr) {
$row = [];
$row[] = $attr['attribute'];
return $row;
})->flatten(1);
$id = $attr->map(function ($attr) {
$row = [];
$row[] = $attr['id'];
return $row;
})->flatten(1)->first();
return [
'id' => $id,
'attributes' => $attribute
];
});
foreach ($attributes as $attr) {
$products = $products->whereHas('characteristics', function ($query) use ($attr) {
$query->where('characteristics_products.characteristic_id', $attr['id'])->whereIn('characteristics_products.value', $attr['attributes']);
});
}
}
switch ($request->order_by) {
case 'all':
$products = $products->orderBy('name->ru', 'asc');
break;
case 'new':
$products = $products->orderBy('id', 'desc');
break;
case 'cheap':
$products = $products->orderByRaw('COALESCE(price_discount, price) ASC');
break;
case 'expensive':
$products = $products->orderByRaw('COALESCE(price_discount, price) DESC');
break;
default:
$products = $products->orderBy('id', 'desc');
break;
}
$paginate = $request->paginate ? (int) $request->paginate : 12;
$page = $request->get('page');
$page = $page == 1 ? 0 : (int)$paginate * (int)$page - (int)$paginate;
$count = $products->count();
$products = $products->skip($page)->take($paginate)->get();
$products->map(function ($product) {
$product->price = $product->getPrice();
$product->price_discount = $product->price_discount == null ? null : $product->getDiscountPrice();
});
return [$count, $products];
}
}