laravel 5.1 如何在身份验证前更改数据库名称

How to change database name before authentication in laravel 5.1

我有多个数据库。我想根据 url 动态更改数据库名称。如何在身份验证之前设置特定的数据库。

我想将数据库从身份验证更改为通过应用程序。 对于前。 如果 url 类似于 lara.local.com/comapny1 然后它将 select 数据库 company1

如果 url 类似于 lara.local。com/company2 然后它将 select 数据库 company2

将根据 selected 数据库进行身份验证,并将 selected 数据库用于该用户。

在 config/database 中为第二个数据库创建条目。php

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

    'company2' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => 'database2',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
     ],

默认情况下,您的查询将使用 mysql 连接将连接更改为 'company1'

DB::connection('company1')->select($query);

此外,您还可以为模型设置数据库连接

$someModel = new MyModel;
$someModel->setConnection('company1');

您可以使用 Request::is() 从 URL

获取 URI
if(Request::is('company1')){
    //change database to company1
    Config::set("database.connections.company1.database", 'company1');
}
elseif(Request::is('company2'){
    Config::set("database.connections.company1.database", 'company2');
}

您可以通过以下步骤实现此目的:

1 定义多个连接到database.php 例如:

'db1' => array(    
    'driver'    => 'mysql',  
    'host'      => 'localhost',  
    'database'  => 'db1_connection',  
    'username'  => 'root',  
    'password'  => '',  
    'charset'   => 'utf8',  
    'collation' => 'utf8_unicode_ci',  
    'prefix'    => '',  
),

2 根据条件语句使用连接(你应该把这段代码移到其他地方)

//Check url that contains 'MYCODE'
if ('URL Contains' == 'MYCODE') {
  DB::disconnect();
  Config::set('database.default','db1');
  DB::reconnect();
}
else {
    DB::disconnect();
  Config::set('database.default','db2');
  DB::reconnect();
}

它应该适合你,但我还没有测试过。引用自 Marcin Nabialek

的回答

您可以像这样在 AppServiceProvider boot() 中执行此操作

public function boot()
{
  if($this->app['request']->getHost()=='test.com') {
       Config::set('database.default','mysql');
    }
  else{
    Config::set('database.default','mysql1');
  }

}