Laravel在运行时更改数据库参数

时间:2017-02-16 16:56:04

标签: php mysql laravel

我希望在用户登录后更改数据库连接的运行时间。我使用Config Facade的方法集。我知道我只能在Middleware或Controller构造函数上使用它。所以我创建了这些

 Route::get("login", "Login_Controller@login");

 Route::group(["middleware" => "test"], function() {
    Route::post("login", "Login_Controller@login");
 });

然后我创建了"测试"登录后提交的中间件提交:

public function handle($request, Closure $next) {

    // Validazione dei dati
    $validator = Validator::make($request->all(), [
                "codice_azienda" => "required",
                "username" => "required",
                "password" => "required"
    ]);

    if ($validator->fails()) {
        return redirect()->back()->withInput()->withErrors($validator);
    }

    // Verifico i dati immessi
    $codice_azienda = $request->get("codice_azienda");
    $username = $request->get("username");
    $password = $request->get("password");

    $objOperatore = new Operatore();
    $cliente = $objOperatore->loginOperatore($codice_azienda, $username, $password);
    if (empty($cliente)) {
        throw new \App\Exceptions\LoginFailedException;
    }

    Config::set("DB_HOST", Crypt::decrypt($cliente->Server));
    Config::set("DB_DATABASE", $cliente->NomeDB);
    Config::set("DB_USERNAME", Crypt::decrypt($cliente->Username));
    Config::set("DB_PASSWORD", Crypt::decrypt($cliente->Password));

    $operatori = Operatore_Model::all();
    \App\Http\Controllers\Log_Controller::debug($operatori, true);

    return $next($request);
}

但是Operatore_Model的metoed all()并没有返回任何内容

日志返回此错误:

  

" [2017-02-16 16:44:52] local.ERROR:exception' PDOException'同   消息' SQLSTATE [42S02]:[Microsoft] [用于SQL的ODBC驱动程序11   服务器] [SQL Server]无效的对象名称'运营商'。'在   C:\ XAMPP \ htdocs中\仪表板\ WWW \ E730 \厂商\ laravel \框架\ SRC \照亮\数据库\ Connection.php:323"

我想使用多DB连接,每个客户一个。

2 个答案:

答案 0 :(得分:1)

我以这种方式解决了:

config :: set的部分是错误的,要访问数据库配置,我应该使用点(。)样式,这样:

Config::set("database.connections.sqlsrv.host", Crypt::decrypt($cliente->Server));
Config::set("database.connections.sqlsrv.database", $cliente->NomeDB);
Config::set("database.connections.sqlsrv.username", Crypt::decrypt($cliente->Username));
Config::set("database.connections.sqlsrv.password", Crypt::decrypt($cliente->Password));

然后重新连接到DB:

\Illuminate\Support\Facades\DB::reconnect();

我对所有遇到此问题的建议是使用双数据库连接,一个用于主数据库(服务器数据库),另一个用于客户数据库。通过这种方式,您可以使用以下简单代码切换到db:

Config::set("database.default", "sqlsrvCustomer");
\Illuminate\Support\Facades\DB::reconnect();

使用第一个命令,您可以选择客户数据库,第二个命令可以连接到客户数据库。

答案 1 :(得分:0)

可能您只需要使用新凭据添加新数据库或克隆现有对象并使用它。您可以编写一些包装器:

{{1}}