Сортировка по связанному полю из другой БД в GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Alex_N
Сообщения: 45
Зарегистрирован: 2015.03.02, 21:20

Сортировка по связанному полю из другой БД в GridView

Сообщение Alex_N » 2018.04.25, 23:26

Всем привет, подскажите пожалуйста.

Имеются 2 таблицы в разных БД. Нужно их соединить и вывести данных в GridView. Вывод данных сделать получилось, а вот сортировку в GridView по связанному полю из другой БД никак не получается сделать. Подскажите пожалуйста, как подступиться к задачке? Может есть у кого какие наработки уже?

Спасибо.

Аватара пользователя
Alexum
Сообщения: 582
Зарегистрирован: 2016.09.26, 10:00

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение Alexum » 2018.04.26, 09:13

Вы же разобрались в сортировке по связанным данным в предыдущем посте. В чём отличие с текущим случаем? Какой тип провайдера используется? Код выкладывайте.

Alex_N
Сообщения: 45
Зарегистрирован: 2015.03.02, 21:20

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение Alex_N » 2018.04.26, 10:09

Alexum писал(а):
2018.04.26, 09:13
Вы же разобрались в сортировке по связанным данным в предыдущем посте. В чём отличие с текущим случаем? Какой тип провайдера используется? Код выкладывайте.
Все верно, в рамках одной БД, удалось реализовать. С разными БД столкнулся проблемой в Join к таблице из другой БД. Сейчас ниже приведу код успешного и неуспешого варианта + ошибку.

Успешный вариант(когда обе таблице в одной бд - один коннект к бд):

Код: Выделить всё

//В Моделе1 описываем связь с Моделью2:

    public function getIdIncKeType()
    {
        return $this->hasOne(Model2:className(), ['id_inc_ke' => 'id_inc_ke_type']);
    }
    
//В поисковой Моделе1Search:

public $idIncKeType;

public function search($params)
    {
        $query = Model1::find();       
      
        $query->joinWith(['idIncKeType']);


        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
        
        $dataProvider->sort->attributes['idIncKeType'] = [
            'asc' => ['foa_inc_ke.name_inc_ke' => SORT_ASC],
            'desc' => ['foa_inc_ke.name_inc_ke' => SORT_DESC],
        ];       
      
        $dataProvider->sort->defaultOrder = ['idIncKeType' => SORT_ASC];
        
        if(!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }


        // grid filtering conditions
        $query->andFilterWhere([
            'id_inc_ke_type' => $this->id_inc_ke_type,
        ]);

        $query->andFilterWhere(['like', 'foa_inc_ke.name_inc_ke', $this->idIncKeType]);
        
        return $dataProvider;
    }
Неуспешный вариант(связываем таблицы разных бд - разные коннекты к бд):

Код: Выделить всё

//В Моделе3 описываем связь с Моделью4:

    public static function tableName()
    {
        return 'ROOTCAUSEM1';
    }
    
    public static function getDb()
    {
        return Yii::$app->get('connect2'); //БД MSSQL
    }

    public function getIdFoaPmMain()
    {
        return $this->hasOne(Model4::className(), ['pm_name' => 'ID']);
    }
    
//Модель4:

    public static function tableName()
    {
        return 'foa_pm_main';
    }

    public static function getDb()
    {
        return Yii::$app->get('connect3'); //БД MYSQL
    }
    
//В поисковой Моделе3Search, делаю по аналогии:

public $idFoaPmMain;

public function search($params)
    {
        $query = Model3::find();       
      
        $query->joinWith(['idFoaPmMain']);

Ошибку ловлю на $query->joinWith(['idFoaPmMain']);:

Код: Выделить всё

Database Exception – yii\db\Exception
SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'foa_pm_main'.
The SQL being executed was: SELECT COUNT(*) FROM [ROOTCAUSEM1] LEFT JOIN [foa_pm_main] ON [ROOTCAUSEM1].[ID] = [foa_pm_main].[pm_name]

Error Info: Array
(
    [0] => 42S02
    [1] => 208
    [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'foa_pm_main'.
)


Аватара пользователя
Alexum
Сообщения: 582
Зарегистрирован: 2016.09.26, 10:00

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение Alexum » 2018.04.26, 10:27

Через два соединения такое работать не будет, кроме того ещё и сами БД разные. Тут либо делать два запроса и объединять в какой-нибудь ArrayDataProvider (но для работы пагинации и сортировки потребуется вытаскивать из обеих БД всё содержимое таблиц), либо настраивать линк между БД и собирать SqlDataProvider.

Alex_N
Сообщения: 45
Зарегистрирован: 2015.03.02, 21:20

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение Alex_N » 2018.04.26, 11:26

Alexum писал(а):
2018.04.26, 10:27
Через два соединения такое работать не будет, кроме того ещё и сами БД разные. Тут либо делать два запроса и объединять в какой-нибудь ArrayDataProvider (но для работы пагинации и сортировки потребуется вытаскивать из обеих БД всё содержимое таблиц), либо настраивать линк между БД и собирать SqlDataProvider.
Мне подходит вариант с ArrayDataProvider. Может быть есть подобные примеры, что можно взять за основу?

Спасибо.

Аватара пользователя
Alexum
Сообщения: 582
Зарегистрирован: 2016.09.26, 10:00

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение Alexum » 2018.04.26, 11:56

Описание провайдера есть в официальной документации. Основная идея:
- получаете содержимое обеих таблиц в виде массива
- объединяете массивы
- помещаете а 'allModels' в ArrayDataProvider.
- используете этот провайдер при формировании GridView.

Если требуется наличие фильтров в GridView, то задача усложняется, ибо встроенных механизмов нет и нужно писать реализацию фильтров. Пример https://stackoverflow.com/questions/284 ... and-filter .

kukuruku
Сообщения: 1221
Зарегистрирован: 2011.02.14, 11:36

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение kukuruku » 2018.04.26, 11:59

проще слить в 1 таблицу

Alex_N
Сообщения: 45
Зарегистрирован: 2015.03.02, 21:20

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение Alex_N » 2018.09.20, 09:40

kukuruku писал(а):
2018.04.26, 11:59
проще слить в 1 таблицу
Но у меня исходные данные такие. Сливать в одну таблицу нельзя. Есть 2 таблицы в разных базах и их нужно сравнить по ключу. Одна из таблиц доступна только на чтение.

andku83
Сообщения: 808
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Сортировка по связанному полю из другой БД в GridView

Сообщение andku83 » 2018.09.20, 12:53

https://www.youtube.com/watch?v=U27PwaYS-nQ - для связывания данных из разных БД

Ответить