Laravel, поменять соединение в модели на один метод? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть база данных разработчиков и живая база данных. Мне нужно вернуть некоторые результаты из действующей базы данных, но только для одного метода в этой модели.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TableName extends Model
{
    protected $table = 'table_name';

    protected $connection = 'dev';

    public $timestamps = false;

    public static function live($index) {

        $liveId = Settings::where('index', $index)->get()[0];

        $live = new TableName;

        $live->setConnection('live');

        $data = $live::where('index', $liveId->live_index)->get();

        dd($live);

        return $data;

    }
}

Если я dd() переменная $live после вызова setConnection, то это говорит о том, что соединение действительно live. Однако, как только я dd() $data, я получаю строки из базы данных dev !

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Eloquent предоставляет хороший способ обработки нескольких соединений.

Вы должны просто иметь возможность использовать метод on. Например.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TableName extends Model
{
    protected $table = 'table_name';

    protected $connection = 'dev';

    public $timestamps = false;

    public static function live($index) {

        $liveId = Settings::where('index', $index)->get()[0];

        $data = self::on('live')->where('index', $liveId->live_index)->get();

        return $data;

    }
}

Затем следует выполнить запрос с использованием соединения live в конфигурации базы данных.

0 голосов
/ 11 сентября 2018

Лично я ничего подобного не делал, но я нашел способ сделать это, выполнив следующие действия.

В файле .env добавьте эти новые переменные env =>

DB_CONNECTION_2=mysql
DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=database2
DB_USERNAME_2=root
DB_PASSWORD_2=secret

Теперь внутри файла config/database.php укажите 2-е соединение mysql с ранее введенными переменными env.

'mysql2' => [
    'driver'    => env('DB_CONNECTION_2'),
    'host'      => env('DB_HOST_2'),
    'port'      => env('DB_PORT_2'),
    'database'  => env('DB_DATABASE_2'),
    'username'  => env('DB_USERNAME_2'),
    'password'  => env('DB_PASSWORD_2'),
],

Теперь вы можете создать модель для требуемой таблицы =>

class myModel extends Eloquent {

    protected $connection = 'mysql2';

}

Тогда вы можете использовать его как обычный способ, чтобы все функции Eloquent в методах контроллера =>

$newMy = new myModel;
$newMy->setConnection('mysql2');
$newMy = $someModel->find(1);
return $something;

Здесь - это ссылка на документацию, которую вы можете прочитать об этом подробнее.

0 голосов
/ 11 сентября 2018

Вы можете попытаться установить соединение по умолчанию перед точкой с

$defaultConnection = DB::getDefaultConnection();

затем измените соединение по умолчанию на, прежде чем получать результаты из 'live'

DB::setDefaultConnection('live');

и затем восстановить соединение, как только «живое» соединение больше не требуется

DB::setDefaultConnection($defaultConnection);

В качестве альтернативы вы можете генерировать свои данные, используя DB::connection('live'). Дополнительная информация на Использование нескольких подключений к базе данных

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