Сортировка вычисляемых полей в Yii2 (Grid View)

мне нужно отсортировать некоторые поля (asc, desc) в GridView, но те же поля рассчитываются. Посмотрите на код ниже:
SearchModel:

class ObjectSearch extends Object {
use SearchModelTrait;

public function rules()
{
return [
['id', 'integer', 'min' => 1],
];
}

public function search($params)
{
$this->company_id = \Yii::$app->user->identity->companyId;
$query = Object::find()->where(['company_id' => $this->company_id]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => false,
]);
$dataProvider->setSort([
'attributes' => [
'id',
'name',
'lastReportResult' => [
'asc' => ['lastReportResult' =>SORT_ASC ],
'desc' => ['lastReportResult' => SORT_DESC],
'default' => SORT_ASC
],
'reportPercentDiff'
]
]);

if (!($this->load($params,'ObjectSearch') && $this->validate())) {
return $dataProvider;
}

$this->addCondition($query, 'id');

return $dataProvider;
}

Методы в объектной модели:

public function getLastReportResult()
{
$lastReport = $this->getLastReport();
$message = 0;

if (!empty($lastReport)) {
$statistic = new ReportStatistic($lastReport);
$message = $statistic->getPercent();
}

return $message;
}

/**
* @return int
*/
public function getReportPercentDiff()
{
$lastReport = $this->getLastReport();
$message = 0;

if (!empty($lastReport)) {
$statistic = $lastReport->getReportDiff();

if (!empty($statistic['diff'])) {
$message = $statistic['diff']['right_answers_percent_diff'];
} elseif (!empty($statistic['message'])) {
$message = $statistic['message'];
}
}
return $message;
}

Итак, с помощью этих методов я вычисляю значения двух полей, которые необходимо отсортировать. Этот способ не работает, у меня есть исключение базы данных, потому что таблица объектов не имеет этих полей. исключение
Как сделать сортировку этих полей?

5

Решение

Добавьте два открытых свойства в ObjectSearch.php и пометить его как безопасный

class ObjectSearch extends Object {
use SearchModelTrait;
public $lastReportResult, $reportPercentDiff;
public function rules()
{
return [
['id', 'integer', 'min' => 1],
[['lastReportResult', 'reportPercentDiff'], 'safe']
];
}

public function search($params)
{
$this->company_id = \Yii::$app->user->identity->companyId;
$query = Object::find()->where(['company_id' => $this->company_id]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => false,
]);
$dataProvider->setSort([
'attributes' => [
'id',
'name',
'lastReportResult' => [
'asc' => ['lastReportResult' =>SORT_ASC ],
'desc' => ['lastReportResult' => SORT_DESC],
'default' => SORT_ASC
],
'reportPercentDiff' => [
'asc' => ['reportPercentDiff' =>SORT_ASC ],
'desc' => ['reportPercentDiff' => SORT_DESC],
'default' => SORT_ASC
],
]
]);

if (!($this->load($params,'ObjectSearch') && $this->validate())) {
return $dataProvider;
}

$this->addCondition($query, 'id');

return $dataProvider;
}

Затем в index.php (просмотреть файл, в котором у вас есть вид сетки) добавить lastReportResult а также reportPercentDiff в массиве всех атрибутов (список всех атрибутов об Object модель)

...
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],// your other attribute here
'lastReportResult',
'reportPercentDiff',

['class' => 'yii\grid\ActionColumn'],
],
]); ?>
...

Для получения дополнительной информации вы можете посетить Блог Картика на Yii

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]