joinWith('lang'); // add conditions that should always apply here $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $this->load($params); /*if (!$this->validate()) { // uncomment the following line if you do not want to return any records when validation fails // $query->where('0=1'); return $dataProvider; }*/ $dataProvider->setSort([ 'attributes' => [ 'brand_id', 'brand_name' => [ 'asc' => [ 'brand_lang.name' => SORT_ASC ], 'desc' => [ 'brand_lang.name' => SORT_DESC ], ], ], ]); // grid filtering conditions $query->andFilterWhere([ 'brand.brand_id' => $this->brand_id, ]) ->andFilterWhere([ 'ilike', 'brand_lang.name', $this->brand_name, ]); return $dataProvider; } /** * @param null|Category $category * @param array $params * @param null|ActiveQuery $productQuery * * @return ActiveQuery */ public function getBrands($category = NULL, $params = [], $productQuery = NULL) { $query = Brand::find() ->select([ Brand::tableName() . '.*', ]) ->innerJoin(Product::tableName(), Product::tableName() . '.brand_id=' . Brand::tableName() . '.brand_id') ->innerJoin(ProductCategory::tableName(), ProductCategory::tableName() . '.product_id=' . Product::tableName() . '.product_id'); $query->innerJoin('product_variant', 'product_variant.product_id = ' . Product::tableName() . '.product_id'); $query->where([ '!=', 'product_variant.stock', 0, ]); $query->groupBy(Product::tableName() . '.product_id'); if(!empty( $category )) { $query->andWhere([ ProductCategory::tableName() . '.category_id' => $category->category_id, ]); } $query->groupBy(Brand::tableName() . '.brand_id'); return $query; } }