Допустим есть модель товаров и модель категории. Две таблицы в БД product & category. Каждый товар принадлежит к какой либо категории. В таблице product это связь указана через колонку category_uid и нужно, чтобы в списке товаров вместо ИД категории было указано название колонки.
То есть в начале имеем непонятные цифры:
Теперь мы можем воспользоваться официальной документацией и застрять на ошибке Unknown Property category.name
Или воспользоваться другой инструкцией, получив и фильтрацию, и сортировку.
В модели Product делаем связь продукт — категория:
1 2 3 4 5 6 |
public function getCategory() { return $this->hasOne(Category::className(), ['uid' => 'category_uid']); } |
В виджет GridView добавляем название колонки:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], [ 'attribute' => 'category', 'label' => 'Моя категория', 'value' => 'category.name', ], |
В классе ProductSearch добавляем необходимые свойства и методы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
// Свойство public $category; public function rules() { return [ [['id','active'], 'integer'], [['category'], 'safe'], ]; } public function search($params) { $query = Product::find()->orderBy('order', 'name'); // 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; } // Для версии 2.0.7 и выше //$query->joinWith('category as category'); // Или просто $query->joinWith('category'); // Превратится в запрос // SELECT `product`.* FROM `product` LEFT JOIN `category` ON `product`.`category_uid` = `category`.`uid` ORDER BY `order` LIMIT 20 $dataProvider->sort->attributes['category'] = [ 'asc' => ['category.name' => SORT_ASC], 'desc' => ['category.name' => SORT_DESC], ]; // category здесь это название таблицы или алиаса $query->andFilterWhere(['like', 'category.name', $this->category]); // Запрос // SELECT `product`.* FROM `product` LEFT JOIN `category` ON `product`.`category_uid` = `category`.`uid` WHERE `category`.`name` LIKE '%пассат%' ORDER BY `order` LIMIT 20 return $dataProvider; } |
В итоге имеем:
· Permalink
Отличная статья. Спасибо огромное
· Permalink
Спасибо, очень рад что вам помог
· Permalink
· Permalink
· Permalink