如何在 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',将它们全部加入
我已经使用 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',将它们全部加入