Имеем 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'],
];
}
}