Настройка динамической базы данных в конфигурации при входе в систему - Laravel - PullRequest
0 голосов
/ 29 января 2019

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

Здесь у моего пользователя есть компания, и его база данных companyA .

Ниже мой LoginController, где я изменил соединение:

public function authenticated(Request $request,User $user)
{
    \Config::set('database.connections.dynamicdb', array(
        'driver'    => 'mysql', 
        'host'      => '127.0.0.1',
        'database'  =>  $user->company,
        'username'  =>  'root',
        'password'  =>  '',
        'charset'   => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'strict'    => false,
        'options'   => [                                
            \PDO::ATTR_EMULATE_PREPARES => true
        ]
    ));

    return redirect()->intended($this->redirectPath());
}

Таким образом, на основании user->company, который уже определен в таблице пользователей, имя базы данных изменено.

Но почему-то это не такт работа.Отображаемая ошибка:

База данных не выбрана.

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

return \Config::get('database.connections.dynamicdb');

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

Так что все изменения я должен сделать.Правильна ли моя техника?Или есть какое-то другое решение для этого.

В моей модели акций я добавил следующие строки:

protected $table = 'stocks';  
protected $connection = 'dynamicdb';

И запрос, который я выполняю, - это всего лишь запрос get all:

 Stock::orderBy('tag_no','asc')->get()

Может кто-нибудь сказать, пожалуйста, почему это происходит?Что мне делать?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Сначала вам нужно создать новую базу данных по умолчанию для соединения и добавить в database.php как обычное соединение

    'dynamicdb' => [
        'driver'      => 'mysql',
        'host'        => env('DB_HOST', '127.0.0.1'),
        'port'        => env('DB_PORT', '3306'),
        'database'    => 'default',
        //others
    ],

Следующие основные модели методов в Stock

   protected $table = 'stocks';  
   protected $connection = 'dynamicdb';

 /**
 * @return string
 */
public function getTable()
{
    $table = parent::getTable();
    $database = config('database.connections.dynamicdb.database');
    return starts_with($table, $database)
        ? $table
        : $database . '.' . parent::getTable();
}

/**
 * Set the table associated with the model.
 *
 * @param  string $table
 * @return $this
 */
public function setTable($table)
{
    $database = config('database.connections.dynamicdb.database');
    $this->table = starts_with($table, $database)
        ? $table
        : $database . '.' . $table;

    return $this;
}

Использование: \Config::set('database.connections.dynamicdb.database',$user->company);или вы можете создать для него помощника. Не забудьте, что этот метод работает только с одним подключением, и подключенный пользователь имеет доступ ко всем базам данных

0 голосов
/ 05 февраля 2019

Добавить несколько БД в .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=

ALT_DB_HOST=127.0.0.1
ALT_DB_PORT=3306
ALT_DB_DATABASE=database2
ALT_DB_USERNAME=root
ALT_DB_PASSWORD=

Редактировать config / database.php

'connections' => [
    'mysql' => [
        ......
    ],

    'alt_mysql' => [
        'driver' => 'mysql',
        'host' => env('ALT_DB_HOST', '127.0.0.1'),
        'port' => env('ALT_DB_PORT', '3306'),
        'database' => env('ALT_DB_DATABASE', 'vibecloud'),
        ...
    ],

Если используется целая модель дляALT_MYSQL затем

protected $connection = 'alt_mysql';

ELSE

protected function stock_info() {
  return \DB::connection('alt_mysql')->select('*')->from('stocks')->get();
}
0 голосов
/ 03 февраля 2019

Все запросы не имеют состояния , поэтому текущий запрос не знает, что вы установили новое значение конфигурации в предыдущем запросе.

Вам следует вызывать Config::set(...) каждый раз, когда вы хотите использовать динамическийбаза данных и задайте имя базы данных, получая это значение из User экземпляра.

Установка выше должна быть выполнена с использованием middleware и поставщика услуг .

Создатьновое промежуточное программное обеспечение и зарегистрируйте его для web группы промежуточного программного обеспечения (это можно сделать с помощью свойства $ middlewareGroups вашего ядра HTTP):

protected $middlewareGroups = [
    'web' => [
        //...
        \App\Http\Middleware\YourMiddleware::class,
    ],
    //...
];

Тогда:

<?php namespace App\Http\Middleware;

class YourMiddleware
{
    public function handle($request, Closure $next)
    {
        if (Auth::check()) {
            $database_name = Auth::user()->company;

            // Set your config here using $user->company
            // ...
        }

        return $next($request);
    }
}

Если необходимочтобы установить это значение один раз (во время аутентификации), вы должны объединить приведенный выше код и сеансы для хранения этой информации между запросами:

session(['db_name' => $dbname]); // Set db_name and store it

$db_name = session('db_name'); // Get db_name from session

Подробнее о сеансах HTTP: https://laravel.com/docs/5.7/session#retrieving-data

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