【问题标题】:How to use multiple databases in Laravel如何在 Laravel 中使用多个数据库
【发布时间】:2015-10-29 02:06:23
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql laravel database


    【解决方案1】:

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

    .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

    使用多个数据库连接

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

    $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

    【讨论】:

    • 您可以使用class SomeModel extends Model { ,并确保在@sba 提到的在database.php 文件中创建新的数据库配置数组时,已从环境文件中删除get 值作为env('DB_DATABASE', 'name')
    • 嘿,我正在使用 Lumen,对于数据库配置部分,我只有“.env”文件。不是database.php。那么我该如何解决这个问题呢?
    • @ChanakaDeSilva 您只需在其中为 Lumen 创建一个配置文件夹和一个 database.php 文件。显然 Lumen 一直在检查该文件是否存在,如果存在就会使用它。
    • @AbdullaNilam some1 来找我做多数据库应用程序首先想到的是我不知道它是否可能现在我知道它很简单;p
    • 哇 .super .谢谢先生。在我的情况下“$users = DB::connection('mysql2')->select(...); ”这很好,先生
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你也可以使用postgres fdw系统

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

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

      【讨论】:

        【解决方案4】:

        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 中的表创建更多模型。

        【讨论】:

          【解决方案5】:

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

          不过,选择查询是在我的默认连接上执行的。仍在尝试弄清楚如何说服 Laravel 以预期的方式工作:更改连接。

          编辑:我想通了。调试 Laravel DatabaseManager 后发现我的 database.php(配置文件)(在 $this->app 中)是错误的。在“连接”部分中,我有诸如“数据库”之类的东西,其中包含我从中复制它的值。明确地说,而不是

          env('DB_DATABASE', 'name')
          

          我需要放置类似的东西

          'myNewName'
          

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

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

          【讨论】:

          • 谢谢!你救了我的理智。我试图弄清楚为什么我的所有查询都引用了默认数据库。然后我读了你的帖子,意识到 env 总是返回 .env 值,第二个参数只是 Laravel 没有使用的后备。
          • 离题:如果管理员不操纵我的帖子,那就太好了。或者至少给我写一条私信,他们想要改变什么以及为什么要改变。我不知道如何发送私人消息。
          • 我遇到了类似的问题,我更改了值但没有更改键。它是这样工作的:'database' => env('DB_NEW_DATABASE', 'myNewDatabase')。记好!
          【解决方案6】:

          在 Laravel 5.1 中,您指定连接:

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

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

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

          【讨论】:

          • 在 Laravel 5.1 中,Eloquent 呢?
          • @simo,看看阿卜杜拉的回答。
          • 我为sam写了一篇完整的文章,你可以在stackcoder.in/posts/… 7.x Multiple Database Connections, Migrations, Relationships & Querying查看
          猜你喜欢
          • 2019-09-13
          • 2015-05-01
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 2020-11-10
          • 1970-01-01
          • 2020-04-10
          相关资源
          最近更新 更多