Yii 2: сортировка по пользовательскому полю, рассчитанному из переменных источников
Я работаю над проектом, который в настоящее время переносится из Yii 1 в Yii 2, и создаю отчет с использованием компонента GridView Yii 2. Этот отчет включает в себя обе колонки, извлеченные из provider_info
таблица в базе данных, поля объединены document_info
модель таблицы и вычисляемые поля на лету, получая все данные из модели под названием ProviderInfo
, Моя проблема возникает в тот момент, когда я хочу отсортировать результаты, используя настраиваемое поле с именем review_type
; это поле проверяет, является ли текущий ProviderInfo
id имеет отношение либо document_info
или же document_info_2
или поле type
внутри собственного ProviderInfo
Модель и выводит комбинацию значений в зависимости от источника.
Если я добавлю review_type
поле для сортировки на ActiveDataProvider
внутри моего ProviderInfo
В модели, я получаю сообщение об ошибке SQL, в котором говорится, что не удается найти поле в предложении order by (что ожидается, поскольку само поле не существует в базе данных), и если я полностью удаляю массив сортировки в модели и передаю его в GridView, затем он распознает поле, но в таблице нет ссылки на имя поля для его сортировки.
Мой текущий getReviewType
Метод работает следующим образом:
const MANUAL_REVIEW = 'Manual review process';
const AUTOMATED_REVIEW = 'Automated review process';
public function getReviewType() {
//builds an object with every possible review table source and type
$sources_matches = array(
array(
'source' => DocumentIdInfo::className(),
'type' => self::MANUAL_REVIEW
),
array(
'source' => DocumentId2Info::className(),
'type' => self::AUTOMATED_REVIEW
)
);
$review_types = '';
$prefix = '';
foreach($sources_matches as $source_match){
$review_match = $source_match['source']::find()->where(["id_provider" => $this->id])->one();
if ($review_match){
$review_types .= $prefix . $source_match['type'];
if (!empty($review_types)){
$prefix = ', ';
}
}
}
if (empty($review_match)) {
if ($this->type == self::TYPE_NGINE) {
return self::MANUAL_REVIEW;
}
if ($this->type == self::TYPE_OQNEXT) {
return self::AUTOMATED_REVIEW;
}
}
if (empty($review_match)){
$review_types = 'N/A';
}
return $review_types;
}
который заполняет мой столбец GridView, используя следующий формат:
<?php
$search = $model->search();
$columns = Utilities::transformGridColums([
'id',
//several fields later...
array(
'name' => 'review_type',
'value' => 'CHtml::value($data, "reviewType")',
)
]);
$columns[] = [
'class' => 'yii\grid\ActionColumn',
'template' => '{view}',
'buttons' => [
'view' => function ($url, $model) {
return Html::a('<i class="fa fa-eye"></i>', $url, [
'title' => Yii::t('app', 'view'),
'class' => 'btn btn-primary btn-xs rounded',
]);
}
],
'urlCreator' => function ($action, $model, $key, $index) {
if ($action === 'view') {
$url = Url::toRoute(array_merge(["view", "id" => $key]));
return $url;
}
}
];
$sort = new Sort([
'attributes' => [
'id',
'full_name',
'review_type' => [
'asc' => ['review_type' => SORT_ASC],
'desc' => ['review_type' => SORT_DESC],
'default' => SORT_ASC,
'label' => 'review Type'
]
],
]);
GridView::widget([
'dataProvider' => $search,
'id' => 'bonus-usage-transaction-grid',
'tableOptions' => ['class' => 'table table-striped table-bordered table-theme table-header'],
'columns' => $columns,
'sorter' => $sort
]);
?>
Utilities::transformGridColums
это всего лишь вспомогательный метод для перевода синтаксиса столбца в синтаксис Yii 2. После всего сказанного и выполненного, отчеты выводятся с правильным стилем и информацией, отчеты позволяют сортировать каждое поле, поступающее непосредственно из поля в базе данных, но нет способа отсортировать по review_type
поле.
Я пропускаю что-то конкретное для Yii 2?
Спасибо