各ユーザーのログインテーブルと対応するデータベース設定を含むmasterデータベースがあります。ログイン時に、テーブルから取得するdb設定を動的に変更する必要があります。 db接続を変更できますが、これは持続しません。
Config::set("database.connections.mysql", [
'driver' => 'mysql',
"Host" => $usr_Host,
"database" => $usr_database,
"username" => $usr_username,
"password" => $usr_password,
...
]);
編集:ユーザーがアプリに登録すると、ユーザーごとに新しいデータベースが作成されるため、config/database.phpで定義されている各ユーザーのデータベース接続がありません
ユーザーのログインにデフォルトのデータベースを使用して、データベース名の新しいフィールドを作成できます。その後、別のデータベースをクエリする必要があるときはいつでも、db接続を変更できます。
このようなもの
$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
これにより、データベースに関して新しいパラメーターを設定できます。
\Config::set('database.connections.mysql.database', $schemaName);
この設定を維持するには、PURGE
について覚えておいてください
DB::purge('mysql');
乾杯!
最初に設定を取得する必要があります。次に、特定のフィールドを変更してから、元に戻します。
$config = Config::get('database.connections.company');
$config['database'] = "company_tenant_$id";
$config['password'] = "test2123";
config()->set('database.connections.company', $config);
データベース接続場所を変更するのに良い場所はbootstrap/app.php
ファイル、以下のコードを使用:
$app->afterBootstrapping(\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, function ($ap) {
// your database connection change may happens here
});
これはServiceProviderの登録と起動の前にあるため、ServiceProviderでDB
またはEloquent
スタッフを使用しても、非常にうまく機能します。
広範囲にわたる調査の後、私はそれをこのように見つけました:
このファイルに移動vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php
メソッドに移動します。protected function authenticate($ request、array $ guards)で、メソッドが開始した直後に、次のコードを貼り付けます。
if(auth()->check() && !empty( auth()->user()->db_name )){
$dynamic_db_name = auth()->user()->db_name;
$config = \Config::get('database.connections.mysql');
$config['database'] = $dynamic_db_name;
$config['password'] = "Your DB Password";
config()->set('database.connections.mysql', $config);
\DB::purge('mysql');
}
まず、ユーザーがログインしているかどうかを確認しています
auth()->check()
次に、db_nameの名前などの列テーブルを各ユーザーに応じてユーザーテーブルに追加した可能性があります。したがって、次の条件では、db_nameが使用可能であることを確認しています。
&& !empty( auth()->user()->db_name )
次に、実行がif条件に入った後、ユーザーレコードからdb_nameを取得し、ユーザーデータベースに従って構成を設定した後、構成を保存し、DBクラスのパージメソッドを使用してこの設定を永続化します。私は本当にそれにこだわっていました。すべてのクラスでdb接続を変更したくありませんでした。だから私はそれを手に入れました。 EloquentとDBの両方を、緊張なくどこでも使用できるようになりました。私のアプリケーションでは、すべてのユーザーのログイン用に1つの中央データベースがあり、組織ごとに異なるデータベースがあります。ユーザーがログインした後は、中央データベース(ログインデータベース)は必要ありません。ユーザー/組織固有のデータベースが必要です。これが私がそれを機能させる方法です。
laravelでできることは、ファイルの接続配列conf/databaseにさまざまな接続を作成することです。これらの接続は、アプリケーションで操作を実行するときに使用できます。
query builderまたはraw expresionsを使用する場合は、connection( 'name')メソッドでクエリを実行します。例:
$users = DB::connection('mysql')
->table('users')
->select(...)
->get();
Eloquentを使用する場合は、モデルファイルのconnection属性で接続の名前を指定できます。次に例を示します。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The connection name for the model.
*
* @var string
*/
protected $connection = 'mysql';
}
問題の解決策は、ファイルconf/databaseにユーザーに応じてさまざまなタイプの接続を作成し、名前を保存することです。ユーザーがユーザーテーブルの列として使用する接続。クエリを作成するときに、ユーザーの接続の名前を取得します。次に例を示します。
$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-conventionshttps://laravel.com/docs/5.5/database#read-and-write-接続