如何在 Laravel 中使用多个数据库 [英] How to use multiple databases in Laravel
问题描述
我想在我的系统中组合多个数据库.大多数时候数据库是MySQL;但将来可能会有所不同,即管理员可以生成这样的报告,该报告使用异构数据库系统的来源.
所以我的问题是Laravel 是否提供任何 Facade 来处理这种情况?或者任何其他框架有更适合问题的能力?
使用 .env
>= 5.0(在 5.5 上测试)(适用于 8)
在.env
DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=数据库 1DB_USERNAME=rootDB_PASSWORD=秘密DB_CONNECTION_SECOND=mysqlDB_HOST_SECOND=127.0.0.1DB_PORT_SECOND=3306DB_DATABASE_SECOND=数据库 2DB_USERNAME_SECOND=rootDB_PASSWORD_SECOND=秘密
在config/database.php
'mysql' =>['司机' =>环境('DB_CONNECTION'),'主机' =>环境('DB_HOST'),'端口' =>环境('DB_PORT'),'数据库' =>环境('DB_DATABASE'),'用户名' =>环境('DB_USERNAME'),'密码' =>环境('DB_PASSWORD'),],'mysql2' =>['司机' =>环境('DB_CONNECTION_SECOND'),'主机' =>环境('DB_HOST_SECOND'),'端口' =>环境('DB_PORT_SECOND'),'数据库' =>环境('DB_DATABASE_SECOND'),'用户名' =>环境('DB_USERNAME_SECOND'),'密码' =>环境('DB_PASSWORD_SECOND'),],
<块引用>
注意:在mysql2
中,如果DB_username和DB_password相同,那么你可以使用env('DB_USERNAME')
,它在.env
前几行.
没有.env
<5.0
定义连接
<块引用>app/config/database.php
返回数组('默认' =>'mysql','连接' =>大批(# 主/默认数据库连接'mysql' =>大批('司机' =>'mysql','主机' =>'127.0.0.1','数据库' =>'数据库1','用户名' =>'根','密码' =>'秘密''字符集' =>'utf8','整理' =>'utf8_unicode_ci','前缀' =>'',),# 二级数据库连接'mysql2' =>大批('司机' =>'mysql','主机' =>'127.0.0.1','数据库' =>'数据库2','用户名' =>'根','密码' =>'秘密''字符集' =>'utf8','整理' =>'utf8_unicode_ci','前缀' =>'',),),);
架构
要指定使用哪个连接,只需运行 connection()
方法
Schema::connection('mysql2')->create('some_table', function($table){$table->increments('id'):});
查询生成器
$users = DB::connection('mysql2')->select(...);
雄辩
在模型中设置 $connection
变量
class SomeModel 扩展 Eloquent {受保护的 $connection = 'mysql2';}
您还可以在运行时通过setConnection
方法或on
静态方法定义连接:
class SomeController 扩展 BaseController {公共函数 someMethod(){$someModel = 新 SomeModel;$someModel->setConnection('mysql2');//非静态方法$something = $someModel->find(1);$something = SomeModel::on('mysql2')->find(1);//静态方法返回 $ 东西;}}
<块引用>
注意 尝试与跨数据库的表建立关系时要小心!可以这样做,但可能会有一些注意事项,具体取决于您拥有的数据库和/或数据库设置.
来自 Laravel 文档
使用多个数据库连接
当使用多个连接时,您可以通过 DB
门面上的连接方法访问每个 connection
.传递给 connection
方法的 name
应对应于您的 config/database.php
配置文件:
$users = DB::connection('foo')->select(...);
您还可以在连接实例上使用 getPdo 方法访问原始的底层 PDO 实例:
$pdo = DB::connection()->getPdo();
有用的链接
- 来自
laracasts.com 的 Laravel 5 多数据库连接
- 在laravel中连接多个数据库 FROM
tutsnare.com
- Laravel 中的多个数据库连接 FROM
fideloper.com
I want to combine multiple databases in my system. Most of the time the database is MySQL; but it may differ in future i.e. Admin can generate such a reports which is use source of heterogeneous database system.
So my question is does Laravel provide any Facade to deal with such situations? Or any other framework have more suitable capabilities for problem is?
Using .env
>= 5.0 (Tested on 5.5) (Works on 8)
In .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret
In 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'),
],
Note: In
mysql2
if DB_username and DB_password is same, then you can useenv('DB_USERNAME')
which is metioned in.env
first few lines.
Without .env
<5.0
Define Connections
app/config/database.php
return array(
'default' => 'mysql',
'connections' => array(
# Primary/Default database connection
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database1',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
# Secondary database connection
'mysql2' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database2',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
);
Schema
To specify which connection to use, simply run the connection()
method
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
Query Builder
$users = DB::connection('mysql2')->select(...);
Eloquent
Set the $connection
variable in your model
class SomeModel extends Eloquent {
protected $connection = 'mysql2';
}
You can also define the connection at runtime via the setConnection
method or the on
static method:
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2'); // non-static method
$something = $someModel->find(1);
$something = SomeModel::on('mysql2')->find(1); // static method
return $something;
}
}
Note Be careful about attempting to build relationships with tables across databases! It is possible to do, but it can come with some caveats and depends on what database and/or database settings you have.
From Laravel Docs
Using Multiple Database Connections
When using multiple connections, you may access each connection
via the connection method on the DB
facade. The name
passed to the connection
method should correspond to one of the connections listed in your config/database.php
configuration file:
$users = DB::connection('foo')->select(...);
You may also access the raw, underlying PDO instance using the getPdo method on a connection instance:
$pdo = DB::connection()->getPdo();
Useful Links
- Laravel 5 multiple database connection FROM
laracasts.com
- Connect multiple databases in laravel FROM
tutsnare.com
- Multiple DB Connections in Laravel FROM
fideloper.com
这篇关于如何在 Laravel 中使用多个数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!