0
votes

I have a model Certificates which has a foreign key application_id of another model called Application. So each certificate belongs to the single application.

Now there is a situation where I would like to show all the certificates of the existing user. The user id exist inside the application model like user_id.

This is the query

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

Now based on the records coming from the above query I would like to show some columns of the certificates and some from the applications using grid view. But for some reasons, if records are more than one then I don't get any column data from the application.

  <?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>

The above grid shows name and user id if a single record get return otherwise it shows "Not set". I Am not sure why 'application.name' and 'application.user_id'are not working when more than one records receive.

Here is my query using 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; }

I will appreciate if someone would tell me what is the mistake I am doing in displaying the proper attributes of the application model.

1

1 Answers

0
votes

First of all (don't use this, i'll show u an logical mistake):

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

U set alias for application b, and then in GridView use application. Anyway, it's still bad if u rename it to b in GridView.


Based on this answer:

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');
}

And the view file:

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

In easiest way to say, your relation from search won't work in GridView, you have to define relations in Model and then use thems ;)

See the code on GitHub