Динамическое соединение с базой данных Laravel 5.8 не устанавливается в модели - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь создать динамическое соединение с базой данных для каждой из моих моделей, чтобы я мог передать имя соединения, используя $model->setConnection('connection_name)

Я пробовал множество ответов на подобные вопросы, но ничего не работает

Я создал класс, который создает новое соединение с базой данных и добавляет его в конфигурацию базы данных

<?php

namespace App;

use Illuminate\Support\Facades\Config;

class Clientdb
{
    public $connection;

    public function __construct($dbUser, $dbPassword, $dbName)
    {
        Config::set('database.connections.' . $dbUser, array(
            'driver'    => 'mysql',
            'host'      => '55.55.55.55',
            'port'      => '3306',
            'database'  => $dbName,
            'username'  => $dbUser,
            'password'  => $dbPassword,
            'unix_socket' => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_general_ci',
            'prefix'    => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                \PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ));

        $this->connection = $dbUser;
    }

    public function connection() {
        return $this->connection;
    }
}

В моем контроллере я создаю новый экземпляр моего нового класса для добавления в конфигурацию базы данных, затем я создаю новый экземпляр моей модели и передаю имя соединения в функцию setConnection () модели.

$this->clientdb = new Clientdb($dbUser, $dbPassword, $dbName);

$model = new \App\MyModel();
// dd($this->clientdb->connection);
$model->setConnection($this->clientdb->connection);
// dd($model);

$result = $model::where('id', $id)->first();

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

Что мне не хватает, чтобы обновить соединение в модели.

Это пример моей модели

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_table';

    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'mysql';
}

sdfsf

1 Ответ

0 голосов
/ 19 мая 2019

Это не работает, потому что $model::where() эквивалентно (new MyModel)->where().

Вызов where() в качестве нестатического метода:

$result = $model->where('id', $id)->first();
                ^^

Вы также можете использовать Model::on():

$result = MyModel::on($this->clientdb->connection)->where('id', $id)->first();
...