为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 INNER JOIN 在 GridView::widget 中显示值

如何使用 INNER JOIN 在 GridView::widget 中显示值

PHP
守着一只汪 2023-09-08 21:59:27
伙计们,我对此很陌生,所以请帮助我。这是我的 SQL:从 tb1 INNER JOIN tb2 ON tb1.login = tb2.user 中选择 tb1.login、tb2.user我不知道如何在查询中创建它,所以我可以在 GridView 中显示值。我做到了,但根本不起作用。$query = TB1::find()->select(['tb1.login', 'tb2.user'])            ->innerWith(TB2::tablename(), 'tb1.login = tb2.user');         return new ActiveDataProvider([            'query' => $query         ]);我的网格视图GridView::widget([                                'dataProvider' => $dataProvider,                                'columns' => [                                    ['class' => 'yii\grid\SerialColumn'],                                    [                                        'attribute' => 'tb1.login',                                    ],                                    [                                        'attribute' => 'tb2.user',                                      }                                    ],                                ],                            ]);在我检查我的 gridview 后显示“未设置”,请帮助我!我对此还很陌生,抱歉
查看完整描述

2 回答

?
慕尼黑8549860

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'])。但我认为这是快速而肮脏的解决方案。


查看完整回答
反对 回复 2023-09-08
?
慕尼黑的夜晚无繁华

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 字段


查看完整回答
反对 回复 2023-09-08
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信