如何连接三个表并在网格视图中获取值

时间:2016-02-19 07:02:08

标签: mysql yii2 cgridview

我有三张桌子:

  1. contacts包含多个群组
  2. contact_groups有多个联系人
  3. contact_contact_groups
  4. 联系

    中的

    contact_id | contact_name

    contact_groups

    中的

    group_id | group_name

    contact_contact_groups

    中的

    contact_contact_group_id | contact_id | group_id

    MODEL

    接触模式

    public function getContactContactGroups()
    {
        return $this->hasMany(ContactContactGroups::className(),
                              ['contact_id' => 'contact_id']);
    }
    

    contact_groups模型

    public function getContactContactGroups()
    {
        return $this->hasMany(ContactContactGroups::className(),
                              ['group_id' => 'group_id']);
    }
    

    contact_contact_groups模型

    public function getGroup()
    {
      return $this->hasOne(ContactGroups::className(), ['group_id' => 'group_id']);
    }
    
    public function getContact()
    {
      return $this->hasOne(Contacts::className(), ['contact_id' => 'contact_id']);
    }
    

    我想像这样显示网格:

    -----------------------------
    Contact Name | Group Name
    -----------------------------
    Me           | Uncategorized
    Mother       | Family
    Jhon         | Business
    

    查看

    <?= GridView::widget([
      'dataProvider' => $dataProvider,
      'filterModel' => $searchModel,
      'tableOptions' =>['class' => 'table table-striped table-bordered'],
      'columns' => [
        [
          'attribute' => 'contact_name',
          'value' => 'contact_name',
        ],
        [
          'attribute' => 'contactContactGroups.group_id',
          'value' => 'contactContactGroups.group.group_name',
          'filter' => Html::activeDropDownList($searchModel, 'group_id', ArrayHelper::map(ContactGroups::find()->where(['group_status'=>'ACTIVE'])->asArray()->all(), 'group_id', 'group_name'),['class'=>'form-control','prompt' => 'Select Group']),
        ],
      ],]); 
    ?>
    

    ContactsController

    public function actionIndex() { 
        $this->unsetThisButton(array(4,5));   
        $searchModel = new ContactsSearch(); 
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
        return $this->render('index', [ 
              'searchModel' => $searchModel, 
              'dataProvider' => $dataProvider,
         ]); 
    }
    

    但它显示(not set)不是group_name。

2 个答案:

答案 0 :(得分:0)

一种简单的方法是基于在模型中添加一个getter,例如:for contact_contact_groups model

你有关系

public function getGroup()
{
  return $this->hasOne(ContactGroups::className(), ['group_id' => 'group_id']);
}

为group_name使用getter

 public function getGroup_group_name() {
    return $this->group->group_name;
}

并在属性的网格视图中

[
  'attribute' => 'group_group_name',
  'filter' => Html::activeDropDownList($searchModel, 'group_id', ArrayHelper::map(ContactGroups::find()->where(['group_status'=>'ACTIVE'])->asArray()->all(), 'group_id', 'group_name'),['class'=>'form-control','prompt' => 'Select Group']),
],

为关系和字段做同样的事情

答案 1 :(得分:0)

我找到了这样简单的东西:)

GRID(VIEW)

[
        'attribute' => 'contactContactGroups.group_id',
        'value'=>function ($data) {
            $d = array();
            foreach ($data->contactContactGroups as $k=>$m)
            {
              $d[] = ContactContactGroups::get_group_name_by_id($m->group_id);
            }
            return implode($d, ', '); 
          },
        'filter' => Html::activeDropDownList($searchModel, 'group_id', ArrayHelper::map(ContactGroups::find()->where(['group_status'=>'ACTIVE'])->asArray()->all(), 'group_id', 'group_name'),['class'=>'form-control','prompt' => 'Select Group']),
      ],

models / ContactContactGroups.php模型

我创建了函数get_group_name_by_id($id)

public static function get_group_name_by_id($id){
  $model = ContactGroups::find()->where(["group_id" => $id])->one();
  if(!empty($model)){
    return $model->group_name;
  }
  return null;
}

所以结果是:

Contact   | Category
-------------------------------
Me        | Business, Family
Erick     | Business, Office
Jhon      | Office

感谢@scaisEdge,你给我some clue;)