Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Получение товаров по параметрам фильтров.
- В пределах одного родителя между параметрами "или". Между родителями "и".
- Модель ProductFilter ('product_id', 'category_id', 'filter_id', 'filter_item_id')
- https://github.com/DmitrySkibitsky
- */
- /**
- * @param $filters // Коллекция с filter_item_id
- * @param null $category_id // Категория
- * @return array // массив с product_id
- */
- public static function getProductsByFilters($filters, $category_id = null) {
- $flatten_filters = $filters;
- // $filters = [int, int, int] => [[int, int], [int]] - по родителю
- $filter_models = Filter::getItems($category_id, $flatten_filters->toArray()); // спикок с фильтров и его параметров
- $filters = $filter_models->map(function ($filter) {
- $children_id = [];
- $filter->children->map(function($children) use (&$children_id) {
- $children_id[] = $children->id;
- });
- return $children_id;
- })->values();
- $query = ProductFilter::query();
- if ($category_id !== null) {
- $query->where('category_id', $category_id);
- }
- $query->whereIn('filter_item_id', $flatten_filters->toArray());
- $products = $query->get();
- $id_products = [];
- $products->groupBy('product_id')->each(function ($product, $key) use ($filters, &$id_products) {
- $id_item_filters = [];
- $product->each(function ($item) use (&$id_item_filters) {
- $id_item_filters[] = $item->filter_item_id;
- });
- $id_item_filters = array_unique($id_item_filters);
- $check_exist_filters = [];
- $filters->each(function ($filter) use (&$check_exist_filters, $id_item_filters) {
- if (is_array($filter)) {
- $check_exist_filters[] = (count(array_intersect($filter, $id_item_filters)) > 0) ? true : false;
- }
- });
- if (!in_array(false, $check_exist_filters)) {
- $id_products[] = $key;
- }
- });
- return $id_products;
- }
Advertisement
Add Comment
Please, Sign In to add comment