If I have 2 fields in db - probability and influence, and I need a column in the GridView where these two fields are multiplied. I managed to add it there, for example:
[ 'attribute' => 'priority', 'format' => 'raw', 'value' => function ($model) { return $model->influence * $model->probability; }, ],
But it cannot handle sorting, because this column is not in db and adding filters to $ query causes only errors.
$query = Risks::find(); $query->select(`probability*influence AS priority`); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]);
Updated (Asc and Desc works, but not with filters)
public function search($params) { $query = Risks::find(); $query->joinWith(['author', 'proj']); $query->select('*, (probability * influence) as priority'); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $dataProvider->setSort([ 'attributes' => [ // 'id', 'probability', 'risks', 'influence', 'del' => [ 'asc' => ['risks.del' => SORT_ASC], 'desc' => ['risks.del' => SORT_DESC], ], 'priority' => [ 'asc' => ['priority' => SORT_ASC], 'desc' => ['priority' => SORT_DESC], 'label' => 'Priority', ], 'proj' => [ 'asc' => ['projects.name' => SORT_ASC], 'desc' => ['projects.name' => SORT_DESC], ], 'author' => [ 'asc' => ['users.name' => SORT_ASC], 'desc' => ['users.name' => SORT_DESC], ] ] ]); $this->load($params); if (!$this->validate()) { // uncomment the following line if you do not want to any records when validation fails // $query->where('0=1'); return $dataProvider; } $query->andFilterWhere([ 'id' => $this->id, 'proj_id' => $this->proj_id, 'author_id' => $this->author_id, 'influence' => $this->influence, 'probability' => $this->probability, //'del' => $this->del, ]) ->andFilterWhere(['like', 'projects.name', $this->proj]) ->andFilterWhere(['like', 'users.name', $this->author]); $query->andFilterWhere(['like', 'risks', $this->risks]); $query->having('priority = '. $this->priority); //$query->having(['priority' => $this->priority]); return $dataProvider; }