Красноречивый, где есть на разных серверах баз данных - PullRequest
1 голос
/ 23 марта 2020

У меня очень специфическая c ситуация с базами данных в Laravel. У нас есть два РАЗЛИЧНЫХ сервера, один с SQL SERVER и один MySQL.

Регулярное соединение (serveTo, hasMany) между двумя разными соединениями и разными серверами работает безупречно, и я можно получить все данные, которые я хочу.

Проблема возникает, когда я хочу добавить WHERE параметры в отношение - Laravel добавит подзапрос "and exists" в запрос - что, конечно, завершится ошибкой, потому что у нас есть два разных сервера.

Обе модели имеют таблицу поправок и соединение, указанные в свойствах модели, и, как я уже сказал, функция ProperTo и hasMany возвращают правильные результаты с обоих серверов. Только ГДЕ условия не отвечают на запрос.

Как можно решить эту проблему и как вы обычно справляетесь с этим?

Очень признателен!

Ответы [ 4 ]

2 голосов
/ 30 марта 2020

Я не уверен, что это решит вашу проблему, но вы можете попробовать пакет laravel-cross-database-subqueries от hoyvoy.

Просто добавьте свои модели с Hoyvoy\CrossDatabase\Eloquent\Model.

1 голос
/ 28 марта 2020

У меня было подобное требование некоторое время go. Решение, на котором я остановился, состояло в том, чтобы реплицировать данные с помощью задания cron с сервера MS SQL на мой сервер MYSQL, но это было в основном потому, что сервер MS SQL был очень медленным по сравнению с сервером MYSQL , Это позволило мне правильно выполнить запрос.

В качестве альтернативы, если вы не хотите копировать данные и можете получить хорошее время отклика от сервера MS SQL, то вы можете посмотреть «временные таблицы» , Если вы сначала запросите сервер MS SQL, а затем создадите временную таблицу на сервере MYSQL с этими данными для запроса, это может подойти как обходной путь.

Если ни один из вышеперечисленных вариантов не подходит, вам нужно будет запросить их по отдельности и использовать PHP для манипулирования данными, потому что вы не можете запросить MYSQL и MS SQL в одном запросе.

0 голосов
/ 02 апреля 2020

Сначала создайте соединение на config/database.php

return [
    'default' => 'first_db_connections',
    'connections' => [
        'first_db_connections' => [
            'driver'    => 'sqlsrv',
            'host'      => 'localhost',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ],

        'second_db_connection' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ],
    ],
],

Таким образом, ваши модели используют обычное соединение по умолчанию, а затем создайте второе соединение модели с вашими моделями

class myModel extends Model {

    protected $connection= 'second_db_connection';

    protected $table = 'myTable';

    public function post() {
        return $this->belongsTo('App\Post');
    }
}
0 голосов
/ 31 марта 2020

Я вижу 2 варианта, первый из которых дублирует базу данных, но вы можете отстать, поэтому использовать не лучший метод.

Второй вариант создать отдельный запрос для фильтра отношений и использовать результат этот запрос для извлечения данных

...