从master数据库获取数据库凭据,然后连接到不同的数据库

时间:2015-04-24 10:05:37

标签: php mysql laravel eloquent database-connection

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

我希望我的应用程序在启动时做什么:

  1. 从主实例表中获取数据库凭据。此实例表位于我在app / config / database.php中定义的默认“mysql”连接中。
  2. 从那时起连接到实例数据库(我不再需要主实例数据库)
  3. 我试图在我的App:before()事件中执行此操作,但这不起作用,因为我的master数据库中没有会话表。如果我在database.php中的返回数组()之前执行它显然无法连接,因为它还没有正确的主数据库凭据。

    我应该在哪里这样做?我应该只是禁用会话并在我的App :: before()中执行,然后启用会话吗?

2 个答案:

答案 0 :(得分:3)

不要认为它可能,但这是一种可能性。

读/写连接

有时您可能希望为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'    => '',
),

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

答案 1 :(得分:1)

经过几个小时的实验和尝试后,我发现最好的选择是在/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;
        }
    }