Laravel 4 - 连接到其他数据库


Laravel 4 - Connect to other database

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

我创建了一个配置.php其中包含数据库连接数据。

但是我怎么能告诉laravel连接到这个数据库而不是使用配置/数据库.php呢?

例如,使用 Schema 类时。

因为似乎没有人明白我想要什么。

我不想使用配置/数据库.php,我想在不同的位置使用不同的配置文件。

听起来你想通了。无论如何,我都会为其他人完成它,或者万一这里有有用的东西给你。

首先,在 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) {})

还有更多关于此的文档 - 请参阅访问连接。

雄辩的ORM您可以在雄辩类中定义"连接"的变量,以设置使用哪个连接。这在"基本用法"部分中有所说明。

在 Github 上查看该变量,以及您可以在此处设置动态设置连接的方法。

编辑OP 已明确表示他们不希望使用 config/database.php 文件进行配置。

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

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

在这种情况下,您可以在 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);

现在通过雄辩连接

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

在查询生成器的情况下,您可以执行

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

立即使用 $DB->select() 进行查询。

希望这将有助于开发人员寻找此问题的可能解决方案

请记住,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();

这是一堆你需要运行的引导,所以把它藏在函数或方法的某个地方。

但是,这是绝对可能的。

有一个更简单的解决方案。如果您使用的是 Larave 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。所以这是一个快速而肮脏的方式来做到这一点。

现在我并没有一直完全利用雄辩的ORM,所以这个"黑客"可能不适用于多对多或一对多雄辩的方法。

有一个想法,但我实际上没有尝试是在 DB1 中创建一个存储过程(例程(,在该例程中,我可以通过查询链接来访问 DB2 表:

SELECT * from db2.mytable where id = 1;

要在另一个位置使用配置文件,请说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");

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

将您的机器添加到$env,

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