web-dev-qa-db-ja.com

Laravelでデータベース接続を動的に変更します

各ユーザーのログインテーブルと対応するデータベース設定を含む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で定義されている各ユーザーのデータベース接続がありません

8
tyro

ユーザーのログインにデフォルトのデータベースを使用して、データベース名の新しいフィールドを作成できます。その後、別のデータベースをクエリする必要があるときはいつでも、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

1
omer Farooq

これにより、データベースに関して新しいパラメーターを設定できます。

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

この設定を維持するには、PURGEについて覚えておいてください

 DB::purge('mysql');

乾杯!

5
Adam Kozlowski

最初に設定を取得する必要があります。次に、特定のフィールドを変更してから、元に戻します。

$config = Config::get('database.connections.company');
$config['database'] = "company_tenant_$id";
$config['password'] = "test2123";
config()->set('database.connections.company', $config);
2
ZeroOne

データベース接続場所を変更するのに良い場所はbootstrap/app.phpファイル、以下のコードを使用:

$app->afterBootstrapping(\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, function ($ap) {
    // your database connection change may happens here
});

これはServiceProviderの登録と起動の前にあるため、ServiceProviderでDBまたはEloquentスタッフを使用しても、非常にうまく機能します。

0
ice6

広範囲にわたる調査の後、私はそれをこのように見つけました:

このファイルに移動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つの中央データベースがあり、組織ごとに異なるデータベースがあります。ユーザーがログインした後は、中央データベース(ログインデータベース)は必要ありません。ユーザー/組織固有のデータベースが必要です。これが私がそれを機能させる方法です。

0
Noor Ahmed

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-接続

0
Rusben Guzman