2 回答
TA贡献1818条经验 获得超11个赞
处理此用例的“正确”方法是使用关系方法
因此,您应该在 TB1 中定义一个方法“hasXXX”(基于您的关系),然后您可以使用“value”选项在 GridView 中访问它
[
'attribute' => 'packageName', // it has to be defined in the model
'value' => function (Contract $model) {
return $model->package->name;
},
]
Yii2 将处理 SQL 和一切......
或者
您只需在 TB1 模型中添加公共属性$publicNameand$userName并在 SQL 中设置 ALIAS即可select(['tb1.login AS loginName', 'tb2.user AS userName'])。但我认为这是快速而肮脏的解决方案。
TA贡献1864条经验 获得超6个赞
为了更明确地帮助您:
在 tb1 模型中添加以下连接函数:
public function getTable2(){
return $this->hasOne(Tb2ModelNameHere::className,['tbl2_id'=>'tbl1_fk_id']);
}
其中 'tbl2_id' 和 'tbl1_fk_id' 分别是连接表 2 和表 1 的字段
在 Gridview 中,您只需调用 join 即可处理查询:
GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'login', // presuming login is an attribute of tbl1
'table2.field_name_here',
// or
[
'attribute' => 'table2.field_name_here',
],
],
]);
上面的代码假设:
DataProvider 来自 Table1。函数“getTable2”必须位于当前 dataProvider 的模型中。换句话说:dataProvider 来自 Table1,并且在 Table1 模型中,我们添加了函数“getTable2”
为了调用函数“getTable2”,我们在 gridview 的属性中使用“table2”。Yii 自动添加“get”并自动将第一个字母大写。因此,“table2.user_name”将调用连接函数“getTable2”并从 Table2 中检索 user_name 字段
- 2 回答
- 0 关注
- 100 浏览
添加回答
举报