yii2 Gridview tidak menampilkan kolom dengan atribut yang digabungkan

Saya memiliki model Sertifikat yang memiliki kunci asing application_id dari model lain yang disebut Aplikasi. Jadi setiap sertifikat milik satu aplikasi.

Sekarang ada situasi di mana saya ingin menampilkan semua sertifikat pengguna yang ada. Id pengguna ada di dalam model aplikasi seperti user_id.

Ini adalah pertanyaannya

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

Sekarang berdasarkan catatan yang berasal dari permintaan di atas saya ingin menunjukkan beberapa kolom sertifikat dan beberapa dari aplikasi menggunakan tampilan grid. Namun karena beberapa alasan, jika record lebih dari satu maka saya tidak mendapatkan data kolom apapun dari aplikasi.

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

Kisi di atas menunjukkan nama dan id pengguna jika satu catatan dikembalikan, jika tidak maka akan ditampilkan "Tidak disetel". Saya tidak yakin mengapa 'application.name' dan 'application.user_id' tidak berfungsi ketika lebih dari satu catatan diterima.

Ini pertanyaan saya menggunakan 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; }

Saya akan menghargai jika seseorang memberi tahu saya kesalahan apa yang saya lakukan dalam menampilkan atribut model aplikasi yang tepat.


person wolvorinePk    schedule 21.01.2017    source sumber


Jawaban (1)


Pertama-tama (jangan gunakan ini, saya akan menunjukkan kesalahan logis):

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

Anda menetapkan alias untuk application b, lalu di GridView gunakan application. Lagi pula, masih buruk jika Anda mengganti namanya menjadi b di GridView.


Berdasarkan jawaban ini:

Model MejaDua:

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

Dan file tampilan:

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

Dengan cara termudah untuk mengatakan, relasi Anda dari pencarian tidak akan berfungsi di GridView, Anda harus mendefinisikan relasi di Model dan kemudian menggunakannya;)

Lihat kode di GitHub

person Yupik    schedule 23.01.2017