Как создать динамическую модель с Eloquent в Laravel? - PullRequest
0 голосов
/ 15 декабря 2018

Я выполняю рефакторинг старой базы данных и хочу быстро запросить / изменить таблицу в разных базах данных.

Например, у меня есть 20 различных баз данных с именами отделов компании:

DbNameWeird-100
DbNameWeird-125
DbNameWeird-245
DbNameWeird-336
...

Каждая база данных имеет одинаковую структуру.То, что я хотел бы сделать, - это полный рефакторинг, где вместо 20 различных соединений я мог бы сделать:

Foo::where('department', 125)->all();

В среднесрочной перспективе целью является объединение этих баз данных путем добавления нового столбца первичного ключа с именемdepartment на каждом столе.Но в настоящее время я бы просто сделал:

$foo = Foo($department);
$foo->all();

Чтобы пойти в этом направлении, мне нужно получить мои соединения:

foreach($departments as $dep) {
    DB::addConnection(dbConnection("DbNameWeird-{$dep}"), "db-{$dep}");
}

Затем мне нужно динамически обновить protected $connection моего *Модель 1017 *.

Чтобы убить двух зайцев одним выстрелом, я написал это:

class Foo extends \Eloquent
{
    protected $table = 'foo';
    protected $connection;
    public $timestamps = false;

    protected $guarded = [];

    public function __construct($department) {
        DB::addConnection(dbConnection("DbNameWeird-{$department}"), "db-{$department}");

        $this->connection = "db-{$department}";
        parent::__construct();
    }
}

dd((new Foo(42))->all());

К сожалению, это не работает.Я получаю эту ошибку:

Too few arguments to function Foo::__construct(), 0 passed in
project/portal/vendor/illuminate/database/Eloquent/Model.php
on line 460 and exactly 1 expected

Что не так с этим кодом?

1 Ответ

0 голосов
/ 15 декабря 2018

Используйте рекомендуемое решение :

Использование нескольких подключений к базе данных

При использовании нескольких connections, вы можете получить доступ к каждому соединению через метод подключения на фасаде DB.name, переданный методу connection, должен соответствовать одному из соединений, перечисленных в вашем файле конфигурации config/database.php:

$users = DB::connection('foo')->select(...);

Вы также можете получить доступ к необработанному базовому экземпляру PDO, используя метод getPdoдля экземпляра соединения:

$pdo = DB::connection()->getPdo();

Если вам нужно изменить соединения на Eloquent models и DB недостаточно :

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

$foo = (new Foo)->setConnection('DbNameWeird-100');
$foo->first(); // or $foo->all();

Или вы можете использовать метод on следующим образом:

Foo::on('DbNameWeird-100')->first();
Foo::on('DbNameWeird-125')->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...