@Monitorkin

Почему не работает сортировка и фильтрация в GridView в Yii2 с MongoBD по связанному полю?

Имеем yii2 + mongodb и две коллекции Items (товары) и Cats (категории товаров). Вывожу в GridView поля из Items + имя категории из связи "cat". Фильтрация и сортировка полей из коллекции Items работает нормально, имя категорий из связанной таблицы Cats выводятся нормально, на заголовке колонки связанного поля "name" появляется ссылка для сортировки и под ним появляется поле для фильтрации, но при клике на заголовке для сортировки ничего не происходит, при вводе значений в поле фильтра тоже ничего не происходит. В чём ошибка? Спасибо за любую помощь.

Model Items:
class Items extends ActiveRecord {

    public static function CollectionName() {
        return ['local', 'items'];
    }

    public function attributes() {
        return ['_id', 'name', 'cat_id'];
    }

    public function rules() {
        return [[['_id', 'name', 'cat_id'], 'string']];
    }

    public function attributeLabels() {
        return [...];
    }

    public function getCat() {
        return $this->hasOne(Cats::className(), [(string) '_id' => (string) 'cat_id']);
    }    
}


Cats->_id это mongo ObjectId, Items->cat_id это string. Так же пробовал делать без преобразования типов в string - результата не дало..

Model ItemsSearch:
class ItemsSearch extends Items {

    public function attributes() {
        return ['_id', 'name', 'cat_id', 'cat.name'];
    }

    public function scenarios() {
        return Model::scenarios();
    }

    public function search($params) {
        $query = Items::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => ['pageSize' => 30],
        ]);

        $dataProvider->sort->attributes['cat.name'] = [
            'asc' => ['cat.name' => SORT_ASC],
            'desc' => ['cat.name' => SORT_DESC],
        ];

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

         $query->andFilterWhere([
                '_id' => $this->_id,
                 ...
            ]);

        $query->andFilterWhere(['like', 'cat.name', $this->getAttribute('cat.name')])
               ...;

        return $dataProvider;
    }

}

Model Cats:
class Cats extends ActiveRecord {

    public static function collectionName() {
        return ['local', 'cats'];
    }

    public function attributes() {
        return [
            '_id',
            'name',
            ...
        ];
    }

    public function rules() {
        return [
            [['_id'], 'required'],
            [['name'], 'string'],
        ];
    }
}
  • Вопрос задан
  • 480 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы