Конечно же связь в модели Категория присутствует:
Код: Выделить всё
// связь - товары в категории
public function getProducts() {
return $this->hasMany(Product::className(), ['category_id' => 'id']);
}
грид:
Код: Выделить всё
[
'attribute' => 'countProducts',
'headerOptions' => ['width' => '50px'],
],
Код: Выделить всё
// вернуть количество товаров в категории
public function getCountProducts() {
$products = $this->products;
return ($products) ? count($products) : 0;
}
Вы скажите, чтобы не париться можно создать поле-счетчик в модели Категория и обновлять его при добавлении/удалении товаров. Но я хочу получить сортировку именно по ВЫЧИСЛЯЕМОМУ полю, мало ли где еще пригодится.
Пробую в модели CategorySearch следующее:
Код: Выделить всё
// объявим переменную (на всякий случай))
public $countProducts;
/**
* @inheritdoc
*/
public function rules() {
return [
[['id', 'parent_id'], 'integer'],
[['title', 'countProducts'], 'safe'],
];
}
Код: Выделить всё
$dataProvider->setSort([
'attributes' => [
'id',
'parent_id',
'title',
'countProducts'
]
]);
Код: Выделить всё
if (!($this->load($params) && $this->validate())) {
/**
* Жадная загрузка данных модели Страны
* для работы сортировки.
*/
$query->joinWith(['products']);
// echo '<pre>' . var_dump($dataProvider) . '</pre>';
return $dataProvider;
}
НО! Облом. Поскольку поле вычисляемое - конечно же его нету в модели (БД). И тут при клике на сортировке вылазит ошибка:
Код: Выделить всё
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'countProducts' in 'order clause'
The SQL being executed was: SELECT `door_category`.* FROM `door_category` LEFT JOIN `door_product` ON `door_category`.`id` = `door_product`.`category_id` ORDER BY `countProducts` LIMIT 50
Кто-то отправит меня на http://nix-tips.ru/yii2-sortirovka-i-fi ... olyam.html. Но там сортировка работает, поскольку соответствующие поля есть в связанной таблице даже при вычисляемом поле (имя+ фамилия). А у меня же оно вообще не связано никак.
Да и плюс в примере по ссылке при попытке добавить строчку вроде этой
Код: Выделить всё
$this->addCondition($query, 'country_id');
Просто представьте, что вам нужно реально вычисляемое поле и средствами SQL его никак не вычислить (ну по условию) (например, мне нужно разное количество шариков в зависимости от возраста человека и его настроения).
Извините за больше количество кода и текста, много чего перерыл и не нашел (в Yii 1.1 столкнулся с такой же проблемой как-то). Мне кажется тут нужны более глубокие знания, чем у меня. (Мы же не ищем легкий путей, так?)