Невозможно соединиться с базой данных с ручными настройками в laravel - PullRequest
0 голосов
/ 30 ноября 2018

Проект, в котором я работаю, требует подключения к нескольким базам данных во время выполнения, я устанавливаю свойства соединения на лету, я делаю это следующим образом:

Я создаю помощников

use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

if(! function_exists('conexionBD')){

    /**
     * Establish a tenant database connection.
     *
     * @param $hostname
     * @param $username
     * @param $password
     * @param $database
     */

    function conexionBD($hostname, $username, $password, $database){
        DB::purge('empresa');

        Config::set('database.connections.empresa.host', $hostname);
        Config::set('database.connections.empresa.database', $database);
        Config::set('database.connections.empresa.username', $username);
        Config::set('database.connections.empresa.password', $password);

        DB::reconnect('empresa');

        Schema::connection('empresa')->getConnection()->reconnect();
    }
}

Я создал Middleware под названием Tenant

public function handle($request, Closure $next) {
        if (($request->session()->get('empresaId')) === null)
            return redirect()->route('inicio')->withErrors(['error' => __('Por favor inicie sesión en alguna empresa antes de intentar esta acción')]);

        $empresa = new empresa();
        $empresa->connect();

        return $next($request);
    }

Моя модель empresa такая:

class empresa extends Model
{
    protected $fillable = [
        'hostname',
        'username',
        'password',
        'database'
    ];

    public function connect()
    {
        if (! $this->connected()) {
            conexionBD(
                $this->hostname,
                $this->username,
                $this->password,
                $this->database
            );
        }
    }

    private function connected()
    {
            $connection = Config::get('database.connections.empresa');
            return $connection['username'] == $this->username &&
            $connection['password'] == $this->password &&
            $connection['database'] == $this->database;
    }
}

Теперь, когда я запускаю этот код, я получаю "SQLSTATE [HY000] [1045] Доступ запрещен для пользователя '' @ 'localhost' (используя пароль: НЕТ) ", в моей конфигурации базы данных база данных, имя пользователя, пароль и хост пустые.В моей базе данных, в таблице empresas, есть те поля с правильной информацией, но в момент изменения базы данных система сообщает мне об этом, и я не понимаю, почему, если у меня нет пользователя localhost и моей базы данныхимеет пароль

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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы можете изменить соединение на уровне модели.Я надеюсь, что это поможет.

class ModelOnOtherDB extends Model
{
    public function __construct()
    {
        $this->connection = "other_db";
        parent::__construct();
    }
}

соединение "other_db" должно быть настроено на config / database.php

Другое решение

Возможнорешение изменить соединение

public static function table($table, $bd) {
    return DB::table($table)->connection($db);
}

Но вам нужны все соединения на condig / database.php: (

0 голосов
/ 30 ноября 2018

Проверьте файл .env в корневом каталоге и установите значение базы данных, как показано в примере

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD= 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...