Страница 1 из 1

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

Добавлено: 2018.04.25, 23:26
Alex_N
Всем привет, подскажите пожалуйста.

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

Спасибо.

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

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

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

Добавлено: 2018.04.26, 10:09
Alex_N
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'.
)


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

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

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

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

Спасибо.

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

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

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

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

Добавлено: 2018.04.26, 11:59
kukuruku
проще слить в 1 таблицу

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

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

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

Добавлено: 2018.09.20, 12:53
andku83
https://www.youtube.com/watch?v=U27PwaYS-nQ - для связывания данных из разных БД