Guest User

Untitled

a guest
Jan 26th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.14 KB | None | 0 0
  1. /*
  2. Получение товаров по параметрам фильтров.
  3. В пределах одного родителя между параметрами "или". Между родителями "и".
  4. Модель ProductFilter ('product_id', 'category_id', 'filter_id', 'filter_item_id')
  5.  
  6. https://github.com/DmitrySkibitsky
  7. */
  8.  
  9. /**
  10.  * @param $filters // Коллекция с filter_item_id
  11.  * @param null $category_id // Категория
  12.  * @return array // массив с product_id
  13.  */
  14. public static function getProductsByFilters($filters, $category_id = null) {
  15.     $flatten_filters = $filters;
  16.  
  17.     // $filters = [int, int, int] => [[int, int], [int]] - по родителю
  18.     $filter_models = Filter::getItems($category_id, $flatten_filters->toArray()); // спикок с фильтров и его параметров
  19.     $filters = $filter_models->map(function ($filter) {
  20.         $children_id = [];
  21.         $filter->children->map(function($children) use (&$children_id) {
  22.             $children_id[] = $children->id;
  23.         });
  24.         return $children_id;
  25.     })->values();
  26.  
  27.     $query = ProductFilter::query();
  28.  
  29.     if ($category_id !== null) {
  30.         $query->where('category_id', $category_id);
  31.     }
  32.     $query->whereIn('filter_item_id', $flatten_filters->toArray());
  33.  
  34.     $products = $query->get();
  35.  
  36.     $id_products = [];
  37.    
  38.     $products->groupBy('product_id')->each(function ($product, $key) use ($filters, &$id_products) {
  39.         $id_item_filters = [];
  40.         $product->each(function ($item) use (&$id_item_filters) {
  41.             $id_item_filters[] = $item->filter_item_id;
  42.         });
  43.         $id_item_filters = array_unique($id_item_filters);
  44.  
  45.         $check_exist_filters = [];
  46.         $filters->each(function ($filter) use (&$check_exist_filters, $id_item_filters) {
  47.             if (is_array($filter)) {
  48.                 $check_exist_filters[] = (count(array_intersect($filter, $id_item_filters)) > 0) ? true : false;
  49.             }
  50.         });
  51.  
  52.         if (!in_array(false, $check_exist_filters)) {
  53.             $id_products[] = $key;
  54.         }
  55.     });
  56.  
  57.     return $id_products;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment