如何动态更改Laravel中的数据库连接?

问题描述:

我正在处理多租户多数据库应用程序,并且正在致力于注册租户。所以我现在想要注册租户。在注册租户的过程中,主数据库中将创建一条新记录,同时为租户创建一个新的数据库。如何动态更改Laravel中的数据库连接?

现在我想迁移租户迁移新的租户数据库,但遗憾的是我不知道如何动态更改数据库连接并迁移所有表并为他设置管理员帐户。

<?php 

namespace App\Http\Controllers\Auth; 

use App\Tenant; 
use Validator; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\ThrottlesLogins; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

use Illuminate\Http\Request; 

class AuthController extends Controller 
{ 
    /* 
    |-------------------------------------------------------------------------- 
    | Registration & Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles the registration of new users, as well as the 
    | authentication of existing users. By default, this controller uses 
    | a simple trait to add these behaviors. Why don't you explore it? 
    | 
    */ 

    use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

    /** 
    * Create a new authentication controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware('guest', ['except' => 'getLogout']); 
    } 

    protected $redirectTo = '/auth/login'; 

    /** 
    * Get a validator for an incoming registration request. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
      'name' => 'required|max:255', 
      'username' => 'required|max:255|unique:tenants', 
      'email' => 'required|email|max:255', 
      'password' => 'required|confirmed|min:6', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    protected function createTenant(array $data) 
    { 
     return Tenant::create([ 
      'name' => $data['name'], 
      'username' => $data['username'], 
     ]); 
    } 

    protected function createDbForNewTenant($username) 
    { 
     \DB::statement('CREATE DATABASE ' . $username); 
    } 

    public function getRegister() 
    { 
     return view('auth.register'); 
    } 

    public function getLogin() 
    { 
     return view('auth.login'); 
    } 

    public function postRegister(Request $request) 
    { 
     $validator = $this->validator($request->all()); 

     if ($validator->fails()) { 
      $this->throwValidationException(
       $request, $validator 
      ); 
     } 

     $this->createTenant($request->all()); 
     $this->createDbForNewTenant($request->username); 

     \Config::set('database.connections.archive.database', $request->username); 

     \Artisan::call('migrate', [ 
      '--path' => 'database/migrations/archive' 
     ]); 

     return redirect($this->redirectPath()); 
    } 
} 

所以,如果你在看的postRegister,我能够做验证好了,我可以创造一个新的记录好并创建DB过。但是现在我需要更改与该数据库的连接并运行迁移命令。我正在使用Config来设置数据库密钥,但我仍然看不到正在运行的迁移。

我在做什么错?

编辑

'connections' => [ 

    'archive' => [ 
     'driver' => 'mysql', 
     'host'  => env('DB_HOST', 'localhost'), 
     'database' => env('DB_DATABASE', 'forge'), 
     'username' => env('DB_USERNAME', 'forge'), 
     'password' => env('DB_PASSWORD', ''), 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
     'strict' => false, 
    ], 

    'tenant' => [ 
     'driver' => 'mysql', 
     'host'  => env('DB_HOST', 'localhost'), 
     'database' => env('DB_DATABASE', 'forge'), 
     'username' => env('DB_USERNAME', 'forge'), 
     'password' => env('DB_PASSWORD', ''), 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
     'strict' => false, 
    ], 

], 

可以动态Laravels数据库配置文件中访问多个连接。

这是一篇很好的文章,展示了如何做到这一点。

http://fideloper.com/laravel-multiple-database-connections

+0

是的,但是这对我的问题有什么合适的。我尝试过'Eloquent :: setConnection()',那给了我一个我无法静态调用的错误。我已经尝试了'$ this-> setConnection()'但是这也给我一个错误,因为我在auth控制器中并不是一个雄辩的实例。 – Rohan

+0

你能告诉我你的数据库配置文件的外观(显然没有真正的凭据)。你会想这样做。 '$ users = DB :: connection('mysql2') - > select(...);' –

+0

我刚编辑我的问题以反映数据库配置文件。每当你找到时间的时候看看它。谢谢。 :) – Rohan