programing

Larvel에서 수동 설정으로 데이터베이스와 연결할 수 없습니다.

muds 2023. 10. 13. 22:34
반응형

Larvel에서 수동 설정으로 데이터베이스와 연결할 수 없습니다.

프로젝트는 런타임에 여러 데이터베이스와 연결해야 하는 작업을 수행하고 있으며, 연결 속성을 즉시 설정하고 있으며, 다음과 같이 수행하고 있습니다.

도우미를 만듭니다.

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

if(! function_exists('conexionBD')){

    /**
     * Establish a tenant database connection.
     *
     * @param $hostname
     * @param $username
     * @param $password
     * @param $database
     */

    function conexionBD($hostname, $username, $password, $database){
        DB::purge('empresa');

        Config::set('database.connections.empresa.host', $hostname);
        Config::set('database.connections.empresa.database', $database);
        Config::set('database.connections.empresa.username', $username);
        Config::set('database.connections.empresa.password', $password);

        DB::reconnect('empresa');

        Schema::connection('empresa')->getConnection()->reconnect();
    }
}

테넌트라는 미들웨어를 만들었습니다.

public function handle($request, Closure $next) {
        if (($request->session()->get('empresaId')) === null)
            return redirect()->route('inicio')->withErrors(['error' => __('Por favor inicie sesión en alguna empresa antes de intentar esta acción')]);

        $empresa = new empresa();
        $empresa->connect();

        return $next($request);
    }

저의 엠프레사 모델은 이렇습니다.

class empresa extends Model
{
    protected $fillable = [
        'hostname',
        'username',
        'password',
        'database'
    ];

    public function connect()
    {
        if (! $this->connected()) {
            conexionBD(
                $this->hostname,
                $this->username,
                $this->password,
                $this->database
            );
        }
    }

    private function connected()
    {
            $connection = Config::get('database.connections.empresa');
            return $connection['username'] == $this->username &&
            $connection['password'] == $this->password &&
            $connection['database'] == $this->database;
    }
}

이 코드를 실행하면 "SQLSTATE [HY000] [1045] 사용자 ''@'localhost''(암호: NO 사용) 오류에 대한 액세스가 거부되었습니다. 데이터베이스 구성에 데이터베이스, 사용자 이름, 암호 및 호스트가 비어 있습니다.데이터베이스의 경우, 요약 표에 올바른 정보가 있는 필드가 있지만 데이터베이스를 변경할 때 시스템이 해당 필드를 알려줍니다. 로컬 호스트 사용자가 없고 데이터베이스에 암호가 있는 경우에는 왜 해당 필드가 있는지 이해할 수 없습니다.

내 코드가 누락되었거나 멀티 테넌트 시스템이 올바르게 작동하지 않도록 잘못하고 있다는 것을 아는 사람이 있습니까?

루트 디렉터리에서 .env 파일을 확인하고 예제와 같이 데이터베이스 값을 설정합니다.

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD= 

모델 레벨에서 연결을 변경할 수 있습니다.도움이 되었으면 좋겠습니다.

class ModelOnOtherDB extends Model
{
    public function __construct()
    {
        $this->connection = "other_db";
        parent::__construct();
    }
}

config/database에 "other_db" 연결을 구성해야 합니다.

기타솔루션

연결 변경을 위한 가능한 해결책

public static function table($table, $bd) {
    return DB::table($table)->connection($db);
}

하지만 콘디그/데이터베이스에 대한 모든 연결이 필요합니다.php :(

언급URL : https://stackoverflow.com/questions/53560119/unable-to-connect-with-database-with-manual-settings-in-laravel

반응형