• 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;
        }
    }
    
  • 相关阅读:
    Codeforces Beta Round #92 (Div. 2 Only) B. Permutations 模拟
    POJ 3281 Dining 最大流 Dinic算法
    POJ 2441 Arrange the BUlls 状压DP
    URAL 1152 Faise Mirrors 状压DP 简单题
    URAL 1039 Anniversary Party 树形DP 水题
    URAL 1018 Binary Apple Tree 树形DP 好题 经典
    pytorch中的forward前向传播机制
    .data()与.detach()的区别
    Argparse模块
    pytorch代码调试工具
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14022472.html
Copyright © 2020-2023  润新知