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?

Спасибо

0 ответов

Другие вопросы по тегам