Laravel 4 - 连接到其他数据库

27

有时我希望连接到另一个数据库。

我创建了一个 config.php 文件并在其中填写了数据库连接数据。

但是我该如何告诉 Laravel 连接到这个数据库,而不是使用 config/database.php 中的设置呢?

比如,当使用 Schema 类时。

由于似乎没有人理解我的需求。

我不想使用 config/database.php,而是想使用位于不同位置的其他配置文件。


由于您没有提供任何特定的“端口”代码,请查看此处,以查看是否回答了您的问题。 - Joachim Isaksson
什么代码?正如我所说,我想创建一个附加的config.php文件,其中包含数据库设置,并连接到它。问题是如何告诉Laravel使用这个配置而不是config/database.php。 - TheNiceGuy
链接页面展示了如何在database.php中添加多个数据库配置,并且如何选择要使用哪一个来连接/查询。 - Joachim Isaksson
1
那么您只需使用 Schema::connection('foo')->create('users', function($table)... 来使用名为 'foo' 的数据库。 - Joachim Isaksson
好的,希望有人有想法。无论如何,谢谢你 :) - TheNiceGuy
显示剩余6条评论
6个回答

60

看起来你已经解决了这个问题。无论如何,我会告诉你我是如何处理的,以便其他人可以参考或者在这里找到一些有用的东西。

首先,在app/config/database.php中添加第二个连接。注意:该文件路径可能因您的环境而异。

<?php
return array(
    'connections' => array(
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

其次,在您的代码中,可以像之前提到的那样使用第二个连接:

Schema::connection('mysql2')->create('users', function($table) {})

这方面有更多的文档说明-请参见访问连接

Eloquent ORM 您可以在Eloquent类中定义变量"connection"来设置使用哪个连接。这在基本用法部分中有说明。

Github上查看该变量和可设置以动态方式设置连接的方法here

编辑 原帖作者已明确表示不希望使用config/database.php文件进行配置。

但是如果没有进一步解释,我无法发表评论。我很乐意帮助-听起来了解为什么不能/不应该使用config/database.php文件可能会很有用,因为这可以帮助我们确定问题并创建有用的解决方案。


1
我使用一个模块系统。这就是原因 ;) - TheNiceGuy
验证方面怎么办?例如,“存在”验证规则。如何告诉它使用其他连接/数据库? - cen
你可以在验证服务提供者中覆盖设置的连接。我不知道是否需要在数据库连接之间切换。你需要深入代码并进行扩展/覆盖。 - fideloper

12

我相信你想要实现一种逻辑分片,其中数据库将会被动态创建。

在这种情况下,你可以在laravel中动态添加一个数据库配置,例如下面的示例:

$conn = array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'DATABASE',
    'username'  => 'USERNAME',
    'password'  => 'SOME_PASSWORD',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
);

Config::set('database.connections.DB_CONFIG_NAME', $conn);

现在通过Eloquent进行连接

MODEL::on('DB_CONFIG_NAME')->WHAT_EVER('1');

如果使用查询生成器,您可以执行以下操作

$DB = DB::connection('DB_CONFIG_NAME');

现在查询请使用$DB->select()

希望这能帮助正在寻找此问题可能解决方案的开发人员


这似乎不适用于Laravel 5.2,DatabaseManager.php:239抛出异常“Database [database.connections.DB_CONFIG_NAME]未配置。”我也尝试了App :: make('config') - > set('database.connections.DB_CONFIG_NAME',$ conn),结果相同。有什么想法吗? - Josip Rodin
抱歉,我的错误。我错过了一个简单的事实,即在稍后引用配置的连接时不需要使用“database.connections.”前缀。由于某种原因,那个错误消息完全让我迷失了方向。 - Josip Rodin

11

请记住,Laravel 4实际上是一组组件,您可以单独使用这些组件。

https://github.com/illuminate/database

这里有一个示例,展示了如何与Capsule类进行交互:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => 'password',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Set the cache manager instance used by connections... (optional)
$capsule->setCacheManager(...);

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent();

这是一堆需要运行的引导程序,所以请将其嵌入到某个函数或方法中。

但它绝对是可能的。


5

有一个更简单的解决方案。如果你正在使用Laravel 4,那么有一个选项适用于我。最近他们添加了$table变量,你可以在你的模型中指定它。请参考这个链接

class User extends Eloquent {

    protected $table = 'my_users';

}

如果您正在使用MySQL,可以执行以下操作:
class User extends Eloquent {

    protected $table = 'mydbname.my_users';

}

如果您正在使用SQL Server,可以这样做:
class User extends Eloquent {

    protected $table = 'mydatabase..my_users';

}

我的配置文件指定了DB1,但我创建了一个模型,想要访问同一MySQL主机中的DB2。所以这是一种快速而肮脏的方法来实现这个目的。
现在我并不总是充分利用Eloquent ORM,所以这个“hack”可能不能与多对多或一对多的Eloquent方法一起使用。
我还有另一个想法,但我没有实际尝试过,那就是在DB1中创建一个存储过程(routine),在该存储过程中我可以通过查询链接访问DB2表,如下所示:
SELECT * from db2.mytable where id = 1;

1
如果您可以接受/能够接受同一用户访问两个数据库,那么这是一个非常优雅的解决方案。 - voidstate

3

要在另一个位置使用配置文件,比如说 src/config

use Config;


$this->dbConfig = Config::get('appname::dbInfo.connections.test');
$this->database = $this->dbConfig['database'];
$this->username= $this->dbConfig['username'];
$this->password= $this->dbConfig['password'];

其中dbInfo是您应用程序中src/config目录中的一个简单php文件,返回包含元素connections的数组,该元素是数据库属性的数组。

您可以使用以下方式告诉Laravel使用外部配置文件:

Config::set("database.connections.test", $this->dbConfig);
DB::connection("test");

1

编辑 bootstrap/start.php 文件并添加您的机器名称(打开终端: hostname)。

将您的机器添加到 $env 中,

$env = $app->detectEnvironment(array(
    'mymachine' => array('mymachine.local'),
));
  1. 'app/config/mymachine' 创建一个新路径。
  2. 添加一个带有新配置参数的 database.php 的副本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接