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

时间:2015-08-06 04:47:55

标签: php mysql database laravel

我想在我的系统中组合多个数据库。大多数时候数据库是MySQL;但是它可能在将来有所不同,即管理员可以生成使用异构数据库系统源的报告。

所以我的问题是 Laravel是否提供任何Facade 来处理这种情况?或者任何其他框架都有更合适的问题能力?

6 个答案:

答案 0 :(得分:316)

Using .env >= 5.0(在5.5上测试)

.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

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

Without .env <5.0

定义连接

  

<强> 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'    => '',
        ),
    ),
);

<强>模式

要指定要使用的连接,只需运行connection()方法

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

查询构建器

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

<强>锋

在模型中设置$connection变量

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

您还可以通过setConnection方法或on静态方法在运行时定义连接:

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;
    }

}
  

注意小心尝试与跨数据库的表建立关系!可以这样做,但它可能带有一些警告,取决于您拥有的数据库和/或数据库设置。

From Laravel Docs

使用多个数据库连接

使用多个连接时,您可以通过 connection 外观上的连接方法访问每个 DB 。传递给 name 方法的 connection 应与 config/database.php 配置文件:

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

您还可以使用连接实例上的getPdo方法访问原始的基础PDO实例:

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

有用的链接

  1. Laravel 5 multiple database connection FROM laracasts.com
  2. Connect multiple databases in laravel FROM tutsnare.com
  3. Multiple DB Connections in Laravel FROM fideloper.com

答案 1 :(得分:9)

在Laravel 5.1中,您指定连接:

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

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

在此处阅读更多内容:http://laravel.com/docs/5.1/database#accessing-connections

答案 2 :(得分:4)

实际上,DB::connection('name')->select(..)对我不起作用,因为'name'必须是双引号:“name”

仍然,选择查询在我的默认连接上执行。仍然试图找出,如何说服Laravel按照预期的方式工作:改变连接。

编辑:我明白了。在调试Laravels DatabaseManager之后,结果发现我的database.php(配置文件)(在$ this-&gt; app里面)是错误的。在“连接”部分,我有类似“数据库”的东西,其中包含我复制它的值。用明确的术语来代替

env('DB_DATABASE', 'name')

我需要放置像

这样的东西
'myNewName'

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

因此,每当我想从另一个数据库中选择某些东西时,我总是在我的默认数据库中

答案 3 :(得分:1)

Laravel具有对多个数据库系统的内置支持,您所需要做的就是在config / database.php文件中提供连接详细信息

return [
    'default' => env('DB_CONNECTION', 'mysql'),



    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
'mysqlOne' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_ONE', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_ONE', 'forge'),
            'username' => env('DB_USERNAME_ONE', 'forge'),
            'password' => env('DB_PASSWORD_ONE', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
];

有了这个,您可以为每个连接创建两个基本模型类,并在这些模型中定义连接名称

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

您可以扩展这些模型以为每个DB中的表创建更多模型。

答案 4 :(得分:0)

你也可以使用 postgres fdw 系统

https://www.postgresql.org/docs/9.5/postgres-fdw.html

您将能够在 postgres 中连接不同的数据库。之后,在一个查询中,您可以访问不同数据库中的表。

答案 5 :(得分:0)

如果您想克隆现有系统并在新数据库上为新客户运行现有代码,这不是一个好的解决方案。

我们将不得不编辑数百个雄辩的调用来插入 DB::connection('foo')