Динамическое изменение подключения к базе данных в Laravel


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

Config::set("database.connections.mysql", [
'driver' => 'mysql',
"host" => $usr_host,
"database" => $usr_database,
"username" => $usr_username,
"password" => $usr_password,
...
]);

Редактировать: Новая база данных создается для каждого пользователя, когда он/она регистрируется в приложении, и поэтому у меня нет подключения к базе данных для каждого пользователя, определенного в config/database.php

Author: tyro, 2017-10-16

4 answers

Ну, вы можете использовать базу данных по умолчанию для входа пользователя и иметь новое поле для имени базы данных. Затем, когда вам понадобится запросить другую базу данных, вы можете просто изменить подключение к БД.

Что-то вроде этого

$someModel = new SomeModel;
$databaseName = "mysql2"; // Dynamically get this value from db
$someModel->setConnection($databaseName);
$something = $someModel->find(1);

Вы можете прочитать больше об этом здесь. http://fideloper.com/laravel-multiple-database-connections

 1
Author: omer Farooq, 2017-10-16 18:16:32

В laravel вы можете создать различные соединения в массиве соединений файла conf/база данных, затем эти соединения вы можете использовать, когда собираетесь выполнять операции в своем приложении.

Если вы используете конструктор запросов или необработанные выражения , вы должны использовать метод подключения ('имя') для выполнения запросов, например:

$users = DB::connection('mysql')
         ->table('users')
         ->select(...)
         ->get();

Если вы используете красноречивый, вы можете указать имя соединения в модели файл в атрибуте подключения, например:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'mysql';
}

Решением вашей проблемы может быть то, что вы создали различные типы соединений в соответствии с пользователями в файле conf/база данных и сохраните имя соединения, которое пользователь использует в качестве столбца в таблице пользователей, и когда вы отправляете запросы, вы получаете имя соединения пользователя, например:

$user = User::find(Auth::id());
$connection = $user->connection;

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

Подробнее информация:

Https://laravel.com/docs/5.5/eloquent#eloquent-model-conventions https://laravel.com/docs/5.5/database#read-and-write-connections

 0
Author: Rusben Guzman, 2017-10-16 19:48:12

Вам нужно сначала получить конфигурацию.. затем изменить конкретное поле, а затем установить его обратно..

$config = Config::get('database.connections.company');
$config['database'] = "company_tenant_$id";
$config['password'] = "test2123";
config()->set('database.connections.company', $config);
 0
Author: ZeroOne, 2017-10-17 01:17:44

Таким образом, вы можете установить новый параметр, когда дело доходит до базы данных:

 \Config::set('database.connections.mysql.database', $schemaName);

Помните о PURGE, чтобы сохранить эти настройки

 DB::purge('mysql');

Ура!

 0
Author: Adam Kozlowski, 2018-09-25 08:22:15