How to use multiple databases in Laravel

前端 未结 4 1402
清歌不尽
清歌不尽 2020-11-21 23:47

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

相关标签:
4条回答
  • 2020-11-22 00:06

    In Laravel 5.1, you specify the connection:

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

    Default, Laravel uses the default connection. It is simple, isn't it?

    Read more here: http://laravel.com/docs/5.1/database#accessing-connections

    0 讨论(0)
  • 2020-11-22 00:06

    Laravel has inbuilt support for multiple database systems, you need to provide connection details in config/database.php file

    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,
            ],
    ];
    

    Once you have this you can create two base model class for each connection and define the connection name in those models

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

    You can extend these models to create more models for tables in each DB.

    0 讨论(0)
  • 2020-11-22 00:13

    Actually, DB::connection('name')->select(..) doesnt work for me, because 'name' has to be in double quotes: "name"

    Still, the select query is executed on my default connection. Still trying to figure out, how to convince Laravel to work the way it is intended: change the connection.

    Edit: I figured it out. After debugging Laravels DatabaseManager it turned out my database.php (config file) (inside $this->app) was wrong. In the section "connections" I had stuff like "database" with values of the one i copied it from. In clear terms, instead of

    env('DB_DATABASE', 'name')
    

    I needed to place something like

    'myNewName'
    

    since all connections were listed with the same values for the database, username, password, etc. which of course makes little sense if I want to access at least another database name

    Therefore, every time I wanted to select something from another database I always ended up in my default database

    0 讨论(0)
  • 2020-11-22 00:29

    Using .env >= 5.0 (tested on 5.5)

    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
    0 讨论(0)
提交回复
热议问题