如何在Laravel中使用多个数据库

我想在我的系统中结合多个数据库。 大部分时间数据库是MySQL; 但是将来可能会有所不同,也就是说Admin可以生成这样的报告,这是异构数据库系统的使用来源

所以我的问题是Laravel提供了任何Facade来处理这种情况? 还是其他的框架有更适合的问题是?

定义连接

app/config/database.php

 return array( 'default' => 'mysql', 'connections' => array( # Primary/Default database connection 'mysql' => array( 'driver' => 'mysql', 'host' => 'host1', 'database' => 'database1', 'username' => 'user1', 'password' => 'pass1' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), # Secondary database connection 'mysql2' => array( 'driver' => 'mysql', 'host' => 'host2', 'database' => 'database2', 'username' => 'user2', 'password' => 'pass2' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ), ); 

架构

在架构生成器中,您可以使用任何连接的架构外观。 要指定使用哪个连接,只需运行connection()方法:

 Schema::connection('mysql2')->create('some_table', function($table) { $table->increments('id'): }); 

询问

与架构生成器类似,您可以在查询生成器上定义一个连接:

 $users = DB::connection('mysql2')->select(...); 

雄辩

你也可以定义在你的Eloquent模型中使用哪个连接!

一种方法是在模型中设置$connectionvariables:

 <?php class SomeModel extends Eloquent { protected $connection = 'mysql2'; } 

您也可以通过setConnection方法在运行时定义连接

 <?php class SomeController extends BaseController { public function someMethod() { $someModel = new SomeModel; $someModel->setConnection('mysql2'); $something = $someModel->find(1); return $something; } } 

注意尝试与跨数据库的表build立关系时要小心! 这是可能的,但它可能会带来一些警告,并取决于你有什么数据库和/或数据库设置。


来自Laravel Docs

使用多个数据库连接

使用多个连接时,可以通过DB门面上的连接方法访问每个connection 。 传递给connection方法的name应该对应于你的config/database.phpconfiguration文件中列出的连接之一:

 $users = DB::connection('foo')->select(...); 

您也可以在连接实例上使用getPdo方法访问原始的底层PDO实例:

 $pdo = DB::connection()->getPdo(); 

使用.env 5.5 (编辑 – 2017-10-22)

.env

 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=homestead2 DB_USERNAME_SECOND=homestead DB_PASSWORD_SECOND=secret 

config/database.php

 'mysql' => [ 'driver' => env('DB_CONNECTION'), 'host' => env('DB_HOST'), 'port' => env('DB_PORT'), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), ], 'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'host' => env('DB_HOST_SECOND'), 'port' => env('DB_PORT_SECOND'), 'database' => env('DB_DATABASE_SECOND'), 'username' => env('DB_USERNAME_SECOND'), 'password' => env('DB_PASSWORD_SECOND'), ], 

注意:mysql2如果DB_username和DB_password是相同的,那么可以使用env('DB_USERNAME') ,它在.env前几行中.env

Schema,Eloquent和Query与上面相同


有用的链接

  1. 资源
  2. Laravel 5多个数据库连接从laracasts.com
  3. 连接laravel从tutsnare.com多个数据库

在Laravel 5.1中,您指定了连接:

 $users = DB::connection('foo')->select(...); 

默认情况下,Laravel使用默认连接。 这很简单,不是吗?

在这里阅读更多: http : //laravel.com/docs/5.1/database#accessing-connections

实际上,DB :: connection('name') – > select(..)不适用于我,因为'name'必须用双引号:'name'

不过,select查询是在我的默认连接上执行的。 仍然试图弄清楚,如何说服Laravel按照预期的方式工作:改变连接。

编辑:我想通了。 debuggingLaravels DatabaseManager后,事实certificate我的database.php(config文件)($ this-> app内)是错误的。 在“连接”部分,我有像“数据库”的东西,我复制它的值的东西。 明确地说,而不是

env('DB_DATABASE','name')

我需要放置类似的东西

'myNewName'

因为所有连接列出的数据库,用户名,密码等相同的值,当然如果我想访问至less另一个数据库名称

因此,每次我想从另一个数据库中select一些东西时,总是以我的默认数据库结束