yii2 Gridview не показывает столбец с объединенными атрибутами

У меня есть модель Certificates, у которой есть внешний ключ application_id другой модели под названием Application. Таким образом, каждый сертификат принадлежит одному приложению.

Теперь возникла ситуация, когда я хотел бы показать все сертификаты существующего пользователя. Идентификатор пользователя существует внутри модели приложения, например user_id.

Это запрос

SELECT * FROM `certificates` 
inner join applications b ON    
application_id = b.id where b.user_id = 7

Теперь, основываясь на записях, полученных из вышеуказанного запроса, я хотел бы показать некоторые столбцы сертификатов и некоторые из приложений, использующих представление сетки. Но по некоторым причинам, если записей больше одной, я не получаю данные столбца из приложения.

  <?php Pjax::begin(); ?>    <?= GridView::widget([
                    'dataProvider' => $dataProvider,
               //     'filterModel' => $searchModel,

                    'columns' => [
                        ['class' => 'yii\grid\SerialColumn'],

                        'application_id',
                         'verified_application_file_path',
                         'certificate_name',
                        'application.name',
                        'application.user_id',


                        [
                            'attribute' => 'creation_date',
                            'format' => ['date', 'php:d/m/Y']
                        ],
                        [
                            'attribute' => 'expiry_date',
                            'format' => ['date', 'php:d/m/Y']
                        ],

                    ],
                ]); ?>
                <?php Pjax::end(); ?></div>

В приведенной выше сетке отображается имя и идентификатор пользователя, если возвращается одна запись, в противном случае отображается «Не задано». Я не уверен, почему application.name и application.user_id не работают при получении более одной записи.

Вот мой запрос с использованием yii2

/**
 * Creates data provider instance with search query applied
 *
 * @param array $params
 *
 * @return ActiveDataProvider
 */
public function search_vendor_certificates($user_id)
{
    $query = ApplicationCertificates::find()->joinWith('application b',true , 'INNER JOIN')->where(["b.user_id"=>$user_id]);

    // add conditions that should always apply here


    $dataProvider = new \yii\data\ActiveDataProvider([
        'query' => $query,
    ]);

return $dataProvider; }

Буду признателен, если кто-нибудь скажет мне, в чем заключается ошибка, которую я делаю при отображении правильных атрибутов модели приложения.


person wolvorinePk    schedule 21.01.2017    source источник


Ответы (1)


Прежде всего (не используйте это, я покажу вам логическую ошибку):

->joinWith('application b',true , 'INNER JOIN')

U установите псевдоним для application b, а затем в GridView используйте application. В любом случае, все равно плохо, если ты переименуешь его в b в GridView.


На основании этого ответа:

Модель TableTwo:

public function getTableOneRecord()
{
    return $this->hasOne(TableOne::className(), ['id' => 't1_id']);
}

public function getTableThreeRecord()
{
    return $this->hasOne(TableThree::className(), ['id' => 't3_id']);
}

public function getTableFourRecord()
{
    return $this->hasOne(TableFour::className(), ['id' => 't4_id'])
        ->via('tableThreeRecord');
}

И файл просмотра:

echo GridView::widget([
   'dataProvider' => $dataProvider,
   'columns' => [
       'id',
       't1_id',
       'tableOneRecord.id',
       't3_id',
       'tableThreeRecord.id',
       'tableThreeRecord.t4_id',
       'tableFourRecord.id',
   ],
]);

Проще говоря, ваше отношение из поиска не будет работать в GridView, вам нужно определить отношения в Model, а затем использовать их;)

См. код на GitHub

person Yupik    schedule 23.01.2017