【问题标题】:Get database credentials from master database, then connect to different database从主数据库获取数据库凭据,然后连接到不同的数据库
【发布时间】:2015-04-24 10:05:37
【问题描述】:

我有一个实例化的 Web 应用程序,它为每个实例使用不同的数据库,但使用相同的文件。

我希望我的应用程序在启动时执行的操作:

  1. 从主实例表中获取数据库凭据。此实例表位于我在 app/config/database.php 中定义的默认“mysql”连接中。
  2. 从那时起连接到实例数据库(我不再需要主实例数据库)

我曾尝试在我的 App:before() 事件中执行此操作,但这不起作用,因为我的主数据库中没有会话表。如果我在 database.php 中的 return array() 之前执行此操作,它显然无法连接,因为它还没有正确的主数据库凭据。

我应该在哪里执行此操作?我应该只禁用会话并在我的 App::before() 中执行此操作,然后在之后启用会话吗?

【问题讨论】:

    标签: php mysql laravel eloquent database-connection


    【解决方案1】:

    不认为有可能,但这里有可能。

    读/写连接

    有时您可能希望为SELECT 语句使用一个数据库连接,而为INSERTUPDATEDELETE 语句使用另一个数据库连接。 Laravel 让这一切变得轻而易举,无论您使用原始查询、查询构建器还是 Eloquent ORM,都将始终使用正确的连接。

    要了解应该如何配置读/写连接,让我们看一下这个例子:

    'mysql' => array(
        'read' => array(
            'host' => '192.168.1.1',
        ),
        'write' => array(
            'host' => '196.168.1.2'
        ),
        'driver'    => 'mysql',
        'database'  => 'database',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
    

    请注意,配置数组中添加了两个键:读取和写入。这两个键都有一个包含单个键的数组值:主机。用于读取和写入连接的其余数据库选项将从主 mysql 数组中合并。因此,如果我们希望覆盖主数组中的值,我们只需要在读写数组中放置项目。因此,在这种情况下,192.168.1.1 将用作“读取”连接,而192.168.1.2 将用作“写入”连接。主 mysql 数组中的数据库凭据、前缀、字符集和所有其他选项将在两个连接之间共享。

    【讨论】:

    • 酷,我不知道!但这并不能解决我的问题。我需要实例数据库的读写权限。
    【解决方案2】:

    经过几个小时的试验和尝试,我发现最好的选择确实是在 /app/config/database.php 文件中手动创建一个 PDO 实例并以这种方式获取数据库凭据:

    // Get instance row
        if (!App::runningInConsole() && !array_key_exists('instance_found', $_ENV)) {
            $conn = new PDO('mysql:dbname=instances;host=127.0.0.1', 'root', 'password');
            $stmt = $conn->prepare('SELECT * FROM instances WHERE http_host=?');
            $stmt->bindParam(1, $_SERVER['HTTP_HOST']);
            $stmt->execute();
    
            $instance = $stmt->fetch(PDO::FETCH_OBJ);
            $conn = null;
    
            if (!$instance) {
                return Response::make('Whoops!', 404);
            } else {
                $_ENV['instance_found'] = true;
    
                $database = $instance->mysql_database;
                $username = $instance->mysql_username;
                $password = $instance->mysql_password;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多