$this->getSearchQuery($category, $params, $in_stock) ->with( [ 'images', 'events', 'variant', 'variant.image', 'comments', 'averageRating', ] ) ->all(), 'pagination' => [ 'pageSize' => 15, ], 'sort' => [ 'attributes' => [ 'name' => [ 'asc' => [ 'name' => SORT_ASC ], 'desc' => [ 'name' => SORT_DESC ], 'default' => SORT_DESC, 'label' => 'имени', ], 'price' => [ 'asc' => [ 'price' => SORT_ASC ], 'desc' => [ 'price' => SORT_DESC ], 'default' => SORT_DESC, 'label' => 'по цене', ], ], ], ] ); return $dataProvider; } public function getSearchQuery($category = null, $params = [], $in_stock = true) { if (!empty($category)) { /** @var ActiveQuery $query */ /**@var Category $category * */ $query = $category->getProducts(); } else { $query = Product::find(); } $query->select([ 'product.*' ]); $query->joinWith( [ 'enabledVariants', 'brand', 'options', 'category', ] ); // $query->groupBy(['product.product_id', 'product_variant.price', 'product_variant.stock']); $query->orderBy([ 'product_variant.stock' => SORT_DESC ]); ProductHelper::_setQueryParams($query, $params); if ($in_stock) { $query->andWhere( [ '!=', ProductVariant::tableName() . '.status', 1, ] ); } /** * Removing products that currently in events */ $query->andWhere( [ 'not', [ 'product.product_id' => ( new Query() )->select('events_to_products.product_id') ->from('events_to_products') ->innerJoin( 'event', 'event.event_id=events_to_products.event_id' )->where(['event.is_event' => true]), ], ] ); return $query; } /** * @param Category|null $category * * @return array */ public function priceLimits($category = null, $params = []) { if (!empty($category)) { /** @var ActiveQuery $query */ // $query = $category->getRelations('product_categories'); $query = $category->getProducts(); } else { $query = Product::find(); } $query->joinWith('variant'); // Price filter fix unset($params[ 'prices' ]); ProductHelper::_setQueryParams($query, $params); $query->andWhere( [ '>=', ProductVariant::tableName() . '.stock', 1, ] ); return [ 'min' => $query->min(ProductVariant::tableName() . '.price'), 'max' => $query->max(ProductVariant::tableName() . '.price'), ]; } }