Как показать значения в GridView :: widget с помощью INNER JOIN - PullRequest
0 голосов
/ 02 августа 2020

Ребята, я новичок в этом, так что, пожалуйста, помогите мне. Это мой SQL:

SELECT tb1.login, tb2.user FROM tb1 INNER JOIN tb2 ON 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

GridView::widget([
                                'dataProvider' => $dataProvider,
                                'columns' => [
                                    ['class' => 'yii\grid\SerialColumn'],
                                    [
                                        'attribute' => 'tb1.login',
                                    ],
                                    [
                                        'attribute' => 'tb2.user',
                                      }
                                    ],
                                ],
                            ]);

После того, как я проверю, что в моем gridview написано, что «не установлено», пожалуйста, помогите мне! Я очень новичок в этом, извини

Ответы [ 2 ]

1 голос
/ 02 августа 2020

«Правильный» способ обработки этого варианта использования - использовать методы отношения (https://www.yiiframework.com/doc/guide/2.0/en/db-active-record#relational -данные )

Итак, вы должны определить метод " hasXXX "(в зависимости от вашего отношения) в TB1, а затем вы можете получить к нему доступ в GridView, используя параметр` value '

[
    'attribute' => 'packageName', // it has to be defined in the model
    'value' => function (Contract $model) {
        return $model->package->name;
    },
]

Yii2 будет обрабатывать SQL и все ...

OR

, вы можете просто добавить publi c property $publicName и $userName в модель TB1 и установить ALIAS в своем SQL select(['tb1.login AS loginName', 'tb2.user AS userName']). Но считаю это быстрым и грязным решением.

0 голосов
/ 04 августа 2020

Чтобы помочь вам более подробно:

В модели tb1 добавьте следующую функцию соединения:

public function getTable2(){
   return $this->hasOne(Tb2ModelNameHere::className,['tbl2_id'=>'tbl1_fk_id']);
}

где 'tbl2_id' и 'tbl1_fk_id' - это поля, которые соединяют таблица 2 и 1 соответственно

Внутри Gridview вы можете просто вызвать соединение, и оно обработает запрос:

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» мы используем «table2» в атрибуте gridview . Yii автоматически добавляет «получить» и автоматически делает первую букву заглавной. Следовательно, table2.user_name вызовет функцию соединения getTable2 и получит поле user_name из Table2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...