Есть ли возможность сделать сортировку в фильтре 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)));
}
}
Код: Выделить всё
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;
}
Подскажите как можно сделать сортировку по вычисляемому полю priceWithStock.
ЗЫ Все модели упрощены, варианты с изменением sql запросов не подойдут, там куча объединений, условий и т.д.
Помогите!!! )