zoukankan      html  css  js  c++  java
  • Laravel同时连接多个数据库

    配置

    一般我们在 .env 文件内指定本地或者线上使用的配置项。这样做比较灵活,很容易区分出不同的设置。

    首先我们在 .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 
    

    当然 DB_HOST 可以是任何远程的数据库,或者本地的数据库资源。有多少个,就需要手动定义多少个,只是把常量加以区分,以便在程序内读取。

    接着在配置目录数据库配置项 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'),
    ],
    

    其中 “mysql”和“mysql2”就是数据库连接 $connection 的别名,用以区分不同的资源。如果方便记忆,可以使用诸如 “mysql_server_a”"mysql_server_b" 这样的符号。

    数据库操作

    对于查询操作,使用原生的方式,需要明确指定从某个连接操作sql,需要这样写:

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

    当然了,我们不推荐在程序内进行原生sql操作,因为这样破坏了数据库表字段的可追溯性,也丧失了 Eloquent ORM 的强大功能。

    所以我们使用模型操作数据库,那么指定某个 Model 使用哪个数据库的哪个表,只需要在模型文件内显式声明:

    class SomeModel extends Model
    {
        protected $connection = 'mysql2';
    }
    

    这样,程序内对于 SomeModel 的所有操作就都是针对 “mysql2”这个连接所指向的数据库。

    Laravel 的灵活还不止这一点半点,如果在Model内不指定$connection,你还可以在控制器内,在命令行程序内,在队列内,在中间件内,在监听器内,都可以任意指定某个Model连接:

    class SomeController extends BaseController {
        public function someMethod()
        {
            $someModel = new SomeModel;
            $someModel->setConnection('mysql2'); // 非静态方法
            $something = $someModel->find(1);
            $something = SomeModel::on('mysql2')->find(1); // 静态方法
            return $something;
        }
    }
    
  • 相关阅读:
    [2017-7-28]Android Learning Day7
    Codeforces Round #402 (Div. 2) D. String Game
    POJ2411 铺地砖 Mondriaan's Dream
    《大型网站系统架构的演化》
    Nginx 引入线程池,提升 9 倍性能
    《淘宝消息中间件概述》2015-07-11
    主从复制源代码分析
    深入剖析Redis主从复制
    主从复制配置
    Redis启动多端口、运行多实例
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14022472.html
Copyright © 2011-2022 走看看