source

Laravel: 데이터베이스에 동적으로 연결

nicesource 2023. 10. 26. 21:14
반응형

Laravel: 데이터베이스에 동적으로 연결

Laravel 5(.1)에서 다른 데이터베이스에 연결하는 데 필요한 애플리케이션을 만들고 있습니다.유일한 문제는 어떤 데이터베이스에 연결해야 하는지 알 수 없기 때문에 데이터베이스를 사용한다는 것입니다.php in config는 불가능합니다.컨트롤러는 동적으로 주어진 연결 세부 정보로 연결을 만드는 역할을 합니다.

DB 클래스를 사용하는 것을 포함하여 데이터베이스에 대한 새로운 연결을 하려면 어떻게 해야 합니까? (또는 이것이 가능합니까?)

미리 감사드립니다!

가장 간단한 해결책은 런타임에 데이터베이스 구성을 설정하는 것입니다.Laravel은 이 설정이 로드될 것으로 예상할 수 있습니다.config/database.php파일이지만 나중에 설정하거나 변경할 수 없는 것은 아닙니다.

로딩된 구성은config/database.php로 저장됩니다.databaseLaravel config에서.그 의미는.connections안배열config/database.php에 저장됩니다.database.connections.

따라서 다음과 같이 연결을 쉽게 재정의/변경할 수 있습니다.

Config::set("database.connections.mysql", [
    "host" => "...",
    "database" => "...",
    "username" => "...",
    "password" => "..."
]);

앞으로 이걸 사용하는 모든 웅변 모델들이mysql연결은 이 새 데이터베이스 연결 구성을 사용하게 됩니다.

가능하면 서비스 공급자에서 이 작업을 수행하는 것이 좋습니다.

저도 같은 문제를 우연히 발견했습니다.

실제로 런타임에 데이터베이스 설정을 변경하여 사용할 수 있습니다.

config() 함수를 사용하여 추가로 설정하거나 기존 연결 설정을 덮어씁니다.

config(['database.connections.mynewconnection' => {settings here}]);

이러한 설정은 캐시에 저장됩니다.따라서 새 설정을 사용해야 할 경우 사용할 연결을 위해 DB 캐시를 삭제합니다.

DB::purge('mynewconnection');

사용되는 기본 연결을 조작할 수도 있습니다.여러 연결을 통해 마이그레이션을 사용하고 사용된 연결 내의 마이그레이션 테이블을 사용하여 마이그레이션을 추적하려는 경우 유용하게 사용할 수 있습니다.물론 다른 멋진 것들도...

DB::setDefaultConnection('mynewconnection');

다음을 사용해야 할 수도 있습니다.

use Illuminate\Support\Facades\Config;
use DB;

데이터베이스 구성 설정:

        Config::set("database.connections.mysql_external", [
            'driver' => 'mysql',
            "host" => "localhost",
            "database" => "db_name",
            "username" => "root",
            "password" => "root",
            "port" => '8889',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ]);

데이터베이스에 연결하고 작업:

    $users = DB::connection('mysql_external')->select('Select id from users');

데이터베이스 연결 끊기 및 구성 변수 재설정

        DB::disconnect('mysql_external');
        Config::set("database.connections.mysql_external", [
            'driver' => 'mysql',
            "host" => "localhost",
            "database" => "",
            "username" => "",
            "password" => "",
            "port" => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ]);

저도 여러 MS Access DB 파일을 MySQL로 가져오는 스크립트로 이 문제를 겪었는데 실행 시 편집 구성을 제안하는 솔루션 중 어느 것도 만족스럽지 못했습니다.가져오기를 원하는 액세스 DB 파일마다 동적으로 새로운 구성을 만드는 것은 보기 흉하고 지저분했습니다.몇 번의 플레이 끝에 라라벨을 설득해 기존 연결에서 DB를 다음과 같이 전환할 수 있었습니다.

$mysqlConn = DB::connection();
$mysqlConn->getPdo()->exec("USE $schemaName;");
$mysqlConn->setDatabaseName($schemaName);

//appServiceProvider.php

 Connection::macro('useDatabase', function (string $databaseName) {
            $this->getPdo()->exec("USE `$databaseName`;");
            $this->setDatabaseName($databaseName);
    });

//usage.

  \DB::connection()->useDatabase($dbName);

database.php에 새 데이터베이스 연결 만들기

    'connections' => [
        'new_db_connection' => [
            'driver' => 'sqlsrv',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_NEW', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
         ],
       'old_db_connection' => [
            'driver' => 'sqlsrv',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_OLD', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
     ]

도우미 메소드 생성

static function getDatabaseName()
{
    // Apply your condition and return databse 
    if(url('/') === 'http://localhost:8001'){
        return 'new_db_connection';
    } else {
        return 'old_db_connection';
    }

}

쿼리 작성기 사용

   $databaseName = Helper::getDatabaseName();
    DB::connection($databaseName)
    ->table('your table name')
    ->select('*')
    ->get();

모델사용

<?php

namespace App\Models;

use App\Helper;
use Illuminate\Database\Eloquent\Model;

class Test extends Model {

    public function __construct()
    {
       // You can apply the below variable dynamically and model 
       // will use that new connection
        $this->connection = Helper::getDatabaseName();

    }

    protected $table = "users";
}
// Without Using any Facades
    
    config(['database.connections.mynewconnection' => [
        'driver' => 'sqlsrv',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE_OLD', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,  
    ]]);


// With Facades
// Use Illuminate\Support\Facades\Config;

Config::set('database.connections.mynewconnection', [
    'driver' => 'sqlsrv',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE_OLD', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,              
]);

쿼리 작성기를 사용하여 데이터베이스 액세스

DB::연결('my new connect')->table(<table_name>)->get();

우리는 다른 방법으로 할 수 있습니다.

    class SomeModel extends Eloquent {

    if(app::environment('local'))
      {
 
        protected $connection = 'mysql2';
     }

이제 모든 곳에서 모델 대신 SomeModel 클래스를 사용합니다.

참조 : https://fideloper.com/laravel-multiple-database-connections

언급URL : https://stackoverflow.com/questions/36085131/laravel-connect-to-databases-dynamically

반응형