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

beg*_*ner 2 yii2

我用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']);
}
Run Code Online (Sandbox Code Playgroud)

在我的视图文件中......

    <?= 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'],
    ],
]); ?>
Run Code Online (Sandbox Code Playgroud)

如何从lib_provinces显示prov_name ???

编辑在评论框中回答用户2839376的问题

在搜索模型类中

$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],
    ];
Run Code Online (Sandbox Code Playgroud)

vit*_*_74 6

LibCities模型中添加新关系:

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

并改变getCityName关系.你应该添加with()关系:

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

并在视图中纠正你的columnto:

 [
            'attribute'=>'prov code',
            'value'=>'cityName.province.prov_name'
        ],
Run Code Online (Sandbox Code Playgroud)