ActiveDataProvider сортировка по вычисляемому полю

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
vv-off
Сообщения: 53
Зарегистрирован: 2018.01.12, 11:49

ActiveDataProvider сортировка по вычисляемому полю

Сообщение vv-off »

Всем Привет!

Есть ли возможность сделать сортировку в фильтре ActiveDataProvider по геттеру модели, который не делает запрос к БД, а использует данные полей.

Например есть таблицы product, price и stock
в модели product

Код: Выделить всё

class Product extends ActiveRecord
{
	public function getPrice(): ActiveQuery
	{
		return $this->hasOne(Price::class, ['id_product' => 'id']);
	}
	
	
	public function getStock(): ActiveQuery
	{
		return $this->hasOne(Stock::class, ['id_product' => 'id']);
	}
	
	public function getPriceWithStock()
	{
		return intval($this->price->unit_price - ($this->price->unit_price * ($this->stock->percent/100)));
	}
}
Есть ProductFilter

Код: Выделить всё

class Filter extends Model 
{
	public $price;
	
	public function rules()
    	{
        	return [
	            [['price'], 'safe'],
        	];
    	}

	$query = Product::find()->with([
		'product.price',
		'product.stock',
	]);

	$provider = new ActiveDataProvider([
		'query' => $query,
		'pagination' => [
			'pageSize' => 10,
		],
		'sort' => [
			'defaultOrder' => [
				'product.nn' => SORT_ASC,
						
			],
		],
	]);
	
	$dataProvider->sort->attributes['price'] = [
		'asc' => ['priceWithStock' => SORT_ASC],
		'desc' => ['priceWithStock' => SORT_DESC],
		'label' => 'Сортировка по цене',
	];
	
	$this->load($params);
	
	if (!$this->validate()) {
		return $dataProvider;
	}
	
	/* Фильтры */
	
	return $dataProvider;
}
Так конечно пишет ошибку SQL запроса что поля "priceWithStock" не найдено.
Подскажите как можно сделать сортировку по вычисляемому полю priceWithStock.
ЗЫ Все модели упрощены, варианты с изменением sql запросов не подойдут, там куча объединений, условий и т.д.

Помогите!!! )
vv-off
Сообщения: 53
Зарегистрирован: 2018.01.12, 11:49

Re: ActiveDataProvider сортировка по вычисляемому полю

Сообщение vv-off »

В общем решил запросом

Код: Выделить всё

->select('
	`product`.*,
        CAST(`product_price`.`unit_price` - 
	         (`product_price`.`unit_price` * IFNULL((IFNULL (max(`stock`.`percent`), `product_price`.`discount`)), 0) / 100) AS INT)
        AS `price_sort`
            ')
И сортирую

Код: Выделить всё

$dataProvider->sort->attributes['price'] = [
	'asc' => ['price_sort' => SORT_ASC],
	'desc' => ['price_sort' => SORT_DESC],
	'label' => 'Сортировка по цене',
];
Может кому пригодиться
vv-off
Сообщения: 53
Зарегистрирован: 2018.01.12, 11:49

Re: ActiveDataProvider сортировка по вычисляемому полю

Сообщение vv-off »

Только теперь фильтры некорректно работают, вместо всех товаров 1 находит (
vv-off
Сообщения: 53
Зарегистрирован: 2018.01.12, 11:49

Re: ActiveDataProvider сортировка по вычисляемому полю

Сообщение vv-off »

С фильтрами всё норм, забыл сделать группировку
$query->groupBy('product.uid');
Ответить