yii2 Gridview不显示具有连接属性的列

时间:2017-01-21 19:41:16

标签: php gridview yii2 yii2-advanced-app

我有一个模型证书,其中包含另一个名为Application的模型的外键application_id。因此,每个证书都属于单个应用程序。

现在有一种情况我希望显示现有用户的所有证书。用户标识存在于应用程序模型中,如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>

如果单个记录返回,则上面的网格显示名称和用户ID,否则显示&#34;未设置&#34;。我不知道为什么&#39; application.name&#39;当收到多条记录时,&application.user_id&#39;不起作用。

这是我使用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; }

如果有人告诉我在显示应用程序模型的正确属性时所犯的错误,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先(不要使用它,我会告诉你一个逻辑错误):

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

U为application b设置别名,然后在GridView中使用application。无论如何,如果你在b中将其重命名为GridView,那仍然很糟糕。

基于this回答:

Model 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中定义关系,然后使用它们;)

See the code on GitHub