Динамическое изменение подключения к базе данных в Laravel
У меня есть основная база данных с таблицей входа и соответствующими настройками базы данных для каждого пользователя. При входе в систему я должен динамически изменять настройки бд, извлекаемые из таблицы. Я могу изменить подключение к бд, но это не сохраняется.
Config::set("database.connections.mysql", [
'driver' => 'mysql',
"host" => $usr_host,
"database" => $usr_database,
"username" => $usr_username,
"password" => $usr_password,
...
]);
Редактировать: Новая база данных создается для каждого пользователя, когда он/она регистрируется в приложении, и поэтому у меня нет подключения к базе данных для каждого пользователя, определенного в config/database.php
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
В 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
Вам нужно сначала получить конфигурацию.. затем изменить конкретное поле, а затем установить его обратно..
$config = Config::get('database.connections.company');
$config['database'] = "company_tenant_$id";
$config['password'] = "test2123";
config()->set('database.connections.company', $config);
Таким образом, вы можете установить новый параметр, когда дело доходит до базы данных:
\Config::set('database.connections.mysql.database', $schemaName);
Помните о PURGE
, чтобы сохранить эти настройки
DB::purge('mysql');
Ура!