如何在 yii2 中连接 3 个表并在 Gridview 中显示,然后使排序正常工作

How to connect 3 tables in yii2 and display in Gridview then make sorting work correctly

我已经使用 gii 工具创建了 crud 应用程序。我有 3 个表 tbl_targetcities、lib_cities 和 lib_provinces。我能够将 lib_cities 连接到 tbl_targetciteis 但不能连接 lib_provinces。而且城市/自治市的排序也不起作用。好像是按照id排序的。

tbl_target_cities

lib_cities

lib_provinces

示例视图

到目前为止,这是我在模型中的关系。

public function getCityName()
{
  return $this->hasOne(LibCities::className(),['city_code'=>'city_code']);
}

在我的视图文件中...

    <?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        [
            'attribute'=>'city_code',
            'value'=>'cityName.city_name'
        ],
                   [
            'attribute'=>'prov code',
            'value'=>'cityName.city_name'
        ],
        'kc_classification',
        'cluster',
        'grouping',
         'priority',
        'launch_year',

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

如何显示来自lib_provinces的prov_name???

编辑以在评论框中回答 user2839376 的问题

在搜索模型中 CLASS

$query = TblSpBub::find();
    $query->joinWith('brgyCode')->joinWith(['cityCode'])->joinWith(['cityCode.provCode']);

    $covered=  LibAreas::find()->where(['user_id'=>yii::$app->user->identity->id])->all();

    $query->all();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort'=> ['defaultOrder' => ['id'=>SORT_DESC]],
    ]);

    $dataProvider->sort->attributes['city'] = [
    'asc' => ['lib_Cities.city_name' => SORT_ASC],
    'desc' => ['lib_Cities.city_name' => SORT_DESC],
    ];

    $dataProvider->sort->attributes['province'] = [
    'asc' => ['lib_provinces.prov_name' => SORT_ASC],
    'desc' => ['lib_provinces.prov_name' => SORT_DESC],
    ];

您必须在模型中使用函数 relations()。

在tbl_target_cities模型中:

public function relations()
  {
    return array(
      'city' => array(self::HAS_ONE, 'LibCities', 'city_code'),
    );
  }

在 LibCities 模型中:

public function relations()
  {
    return array(
      'province' => array(self::HAS_ONE, 'LibProvinces', 'prov_code'),
      'targets' => array(self::HAS_MANY, 'TargetCity', 'city_code',
    );
  }

这将允许您跳过 LibCities 模型, 现在您可以像这样简单地访问 prov 名称:

$model->city->province->prov name;

注意:您需要定义 3 个模型。

编辑

array(
  'name' => 'province name',
  'value' => $data->city->province->prov_name;
),

LibCities 模型中添加新关系:

public function getProvince()
{
  return $this->hasOne(LibProvince::className(),['prov_code'=>'prov_code']);
}

并改变getCityName关系。您应该为关系添加 with()

public function getCityName()
{
  return $this->hasOne(LibCities::className(),['city_code'=>'city_code'])->with(['province']);
}

并在视图中将您的专栏更正为:

 [
            'attribute'=>'prov code',
            'value'=>'cityName.province.prov_name'
        ],

完成了,这是方法。

除了上面的代码(原文post)

// 在模型中我添加了一个额外的函数

public function getTaskowner()
{
   return $this->hasOne(Tasks::className(), ['id' => 'task_id'])
       ->with(
           ['location','taskowner']
       );
}

and in view i did this

 ....
'columns' => [
 ....
[
  'class' => 'kartik\grid\DataColumn',
  'value'=> 'tasks.location.taskowner.name',
  .....
],
.....

成功了

要点。使用带有 'with->(..)' 的数组来包含两者,然后在视图中添加 'tasks.location.taskowner.name',将它们全部加入