如何在 Laravel 中使用多个数据库 [英] How to use multiple databases in Laravel

查看:27
本文介绍了如何在 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();


有用的链接

  1. 来自 laracasts.com 的 Laravel 5 多数据库连接
  2. 在laravel中连接多个数据库 FROM tutsnare.com
  3. 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 use env('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

  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

这篇关于如何在 Laravel 中使用多个数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆