/**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $productsCountSql = self::getProductsCountQuery('`pc`.`id`')->createCommand()->sql;
     $query = ProductCategory::find()->select(['`pc`.*', "({$productsCountSql}) AS `productsCount`"])->from(ProductCategory::tableName() . ' `pc`');
     $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;
     }
     $query->andFilterWhere([]);
     $query->andFilterWhere(['like', 'name', $this->name]);
     $dataProvider->sort = ['attributes' => ['name', 'productsCount'], 'defaultOrder' => ['name' => SORT_ASC]];
     return $dataProvider;
 }
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $this->addParam('categoryId', $params);
     $query = Product::find()->select(['`p`.*', '`pc`.`name` AS `categoryName`'])->from(Product::tableName() . '`p`')->leftJoin(ProductCategory::tableName() . ' `pc`', '`p`.`category_id` = `pc`.`id`');
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $this->load($params);
     if (!$this->validate()) {
         return $dataProvider;
     }
     if (!isset($params['sort'])) {
         $query->orderBy('`p`.`name`');
     }
     $query->andFilterWhere(['`p`.`calories`' => $this->calories, '`p`.`protein`' => $this->protein, '`p`.`fat`' => $this->fat, '`p`.`carbohydrate`' => $this->carbohydrate, '`p`.`category_id`' => $this->categoryId, '`pc`.`name`' => $this->categoryName]);
     $query->andFilterWhere(['like', '`p`.`name`', $this->name])->andFilterWhere(['like', '`pc`.`name`', $this->categoryName]);
     $dataProvider->sort = ['attributes' => ['name', 'calories', 'protein', 'fat', 'carbohydrate', 'categoryName' => [SORT_ASC => '`pc`.`name` ASC', SORT_DESC => '`pc`.`name` DESC']]];
     return $dataProvider;
 }
 /**
  * @param $id
  * @return Product
  */
 public static function findById($id)
 {
     return self::find()->select(['`p`.*', '`pc`.`name` AS `categoryName`'])->from(self::tableName() . ' `p`')->leftJoin(ProductCategory::tableName() . ' `pc`', '`pc`.`id` = `p`.`category_id`')->where(['`p`.`id`' => $id])->one();
 }