我想在我的系统中合并多个数据库.大多数情况下,数据库是MySQL;但它可能会在future 有所不同,即管理员可以生成这样一个报告,这是use source of heterogeneous数据库系统.

那么我的问题是does Laravel provide any Facade来处理这样的情况?或者有没有其他框架有更适合解决问题的能力?

推荐答案

Using .env >= 5.0 (Tested on 5.5) (Works on 8)

In 100

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 100

'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'),
],

如果DB_用户名和DB_密码相同,则可以使用env('DB_USERNAME'),这在前几行的.env行中表示.

Without .env <5.0

Define Connections

100

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

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

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

Query Builder

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

Eloquent

在模型中设置$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;
    }

}

Note在try 跨数据库与表建立关系时要小心!这样做是可能的,但它可能附带一些警告,并且取决于您有什么数据库和/或数据库设置.


From Laravel Docs

Using Multiple Database Connections

当使用多个连接时,您可以通过101 facade上的连接方法访问每个100.传递给100方法的102应该对应于104配置文件中列出的一个连接:

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

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

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

Useful Links

  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

Php相关问答推荐

PHP如何将ARRAY_MAP与Reset()配合使用

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

WooCommerce管理订单列表自定义列不显示值

WooCommerce HPOS管理订单列表中带有订单元数据的定制列

Laravel处理belongToMany和额外字段

为什么PHP PDO忽略NOT NULL约束?

如何在PHP中根据会话将用户重定向到不同的页面?

Regex|PHP捕获json字符串中的每个非法双引号

随机显示WordPress快捷代码功能时出现问题

如何使用 PHP 将带有图像的文本上传到 Linkedin?

PHP Laravel 迁移文件不创建关系

调用未定义的方法 mysqli::execute_query()

Laravel Eloquent(where 子句)

在 Botiga 主题模板中添加复选框到政策行.Woocommerce

保留 .htaccess 中的符号登录 URL

Shopware 6:无法在新的自定义插件中保存关联字段(媒体)

遇到特定键时修改二维数组以创建嵌套数据集

如何在光速网络服务器中使用 apache ..htaccess

在全局安装 Composer 包后运行命令

如何显示分配相同类别的所有帖子?