2016-01-26 46 views
3

我想在GridView中添加一列::小部件yii2:如何在指數(GridView控件)與innerjoin

<?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 

      'id', 
      'owner_id', 
      'situation', 
      'address', 
       [ 
//   'attribute' => 'address', 
      'format' => 'html', 
      'label' => 'Image', 
      'value' => function ($data) { 
       return Html::img('http://iicity.ir/' . $data['address'], 
        ['width' => '60px']); 
      }, 
     ], 

      'slideshow_text', 

      ['class' => 'yii\grid\ActionColumn'], 
     ], 
    ]); ?> 

我想補充的名稱添加一列從另一個表 'owner_id', 名稱是(帳戶)表 表:

ID = 1名=插孔

ID = 2名=薩拉

回答

1
use app\models\Account; 

... 

[ 
    'attribute' => 'owner_id', 
    'value' => function ($model) { 
     $info = Account::findOne(['id' => $model->owner_id]); 

     return isset($info->name) ? $info->name : $model->owner_id; 
    }, 
], 
+0

謝謝 但我仍然無法解決我的問題! 我不知道如何在這裏寫條件! – Saltern

+0

兩張表之間的關係是什麼? – suibber

+0

從slideshow_pics選擇account.co_name,帳戶where slideshow_pics.owner_id = account.id – Saltern

5

@ suibber的接受的答案:

[ 
    'attribute' => 'owner_id', 
    'value'=>function ($model) { 
     $info = Account::findOne(['id' => $model->owner_id]); 

     return isset($info->name) ? $info->name : $model->owner_id; 
    }, 
], 

存在一些問題:

1)構建SQL查詢的邏輯是鑑於暴露,所以MVC princple被違反。視圖僅用於顯示數據。

2)所有相關所有者的數據都是延遲加載的,這意味着查詢量乘以表中顯示的行數。

3)爲什麼顯示owner_id如果記錄不存在?這只是意味着數據已損壞。你甚至不應該在這裏檢查所有者是否存在,因爲在邏輯上它應該總是存在,你需要在保存之前執行驗證,並且不要使用手動編寫的SQL查詢(或使用GUI工具)刪除數據,以防缺少外鍵。

4) IDE缺乏自動完成功能。

Yii2解決這個問題的方法顯然是使用關係。

添加到您的模型:

<?php 

namespace app\models; 

use app\models\User; 
use yii\db\ActiveRecord; 

/** 
* ... 
* 
* @property User $owner 
*/ 
class Picture extends ActiveRecord 
{ 
    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getOwner() 
    { 
     return $this->hasOne(User::className(), ['id' => 'owner_id']); 
    } 
} 

然後顯示所有者名稱在GridView

[ 
    'attribute' => 'owner_id', 
    'value'=>function ($model) {   
     /* @var $model app\models\Picture */ 

     return $model->owner->name; 
    }, 
], 

或者只是:

'owner.name', 

的advandtages是明確的 - 它的框架方法,代碼更短,可讀性更強,可以使用->with('owner')您的ActiveQueryGridView

順便說一句,沒有INNER JOIN是必要的。相關數據是通過單獨的SQL查詢獲取的。如果由於某種原因,老闆是可選的,可以在一些記錄不存在,使用方法:

[ 
    'attribute' => 'owner_id', 
    'value'=>function ($model) {   
     /* @var $model app\models\YourModel */ 

     return $model->owner ? $model->owner->name : null; 
    }, 
], 

具有相關數據的工作很好地覆蓋在official docs,所以這是很基本的問題。首先檢查文檔。