2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
處理此用例的“正確”方法是使用關(guān)系方法
因此,您應(yīng)該在 TB1 中定義一個(gè)方法“hasXXX”(基于您的關(guān)系),然后您可以使用“value”選項(xiàng)在 GridView 中訪問(wèn)它
[
? ? 'attribute' => 'packageName', // it has to be defined in the model
? ? 'value' => function (Contract $model) {
? ? ? ? return $model->package->name;
? ? },
]
Yii2 將處理 SQL 和一切......
或者
您只需在 TB1 模型中添加公共屬性$publicNameand$userName并在 SQL 中設(shè)置 ALIAS即可select(['tb1.login AS loginName', 'tb2.user AS userName'])。但我認(rèn)為這是快速而骯臟的解決方案。

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
為了更明確地幫助您:
在 tb1 模型中添加以下連接函數(shù):
public function getTable2(){
return $this->hasOne(Tb2ModelNameHere::className,['tbl2_id'=>'tbl1_fk_id']);
}
其中 'tbl2_id' 和 'tbl1_fk_id' 分別是連接表 2 和表 1 的字段
在 Gridview 中,您只需調(diào)用 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',
],
],
]);
上面的代碼假設(shè):
DataProvider 來(lái)自 Table1。函數(shù)“getTable2”必須位于當(dāng)前 dataProvider 的模型中。換句話說(shuō):dataProvider 來(lái)自 Table1,并且在 Table1 模型中,我們添加了函數(shù)“getTable2”
為了調(diào)用函數(shù)“getTable2”,我們?cè)?gridview 的屬性中使用“table2”。Yii 自動(dòng)添加“get”并自動(dòng)將第一個(gè)字母大寫(xiě)。因此,“table2.user_name”將調(diào)用連接函數(shù)“getTable2”并從 Table2 中檢索 user_name 字段
- 2 回答
- 0 關(guān)注
- 146 瀏覽
添加回答
舉報(bào)