Laravel 4 - 连接到其他数据库

The*_*Guy 27 php laravel laravel-4

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

我用数据库连接数据创建了一个config.php.

但是我怎么能告诉laravel连接到这个使用config/database.php的数据库呢?

例如,当使用Schema该类时.

因为似乎没有人理解我想要的东西.

我不想使用config/database.php,我想在不同的位置使用不同的配置文件.

fid*_*per 57

听起来你想出来了.无论如何,对于其他人来说,或者如果有什么有用的东西在这里,我就是这样做的.

首先,添加第二个连接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'    => '',
        ),
    ),
);
Run Code Online (Sandbox Code Playgroud)

其次,在您的代码中,您可以使用(如上所述)您希望的第二个连接:

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

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

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

在Github上看到这个变量,以及你可以设置在这里动态设置连接的方法.

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

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


Phi*_*eon 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();
Run Code Online (Sandbox Code Playgroud)

这是你需要运行的一堆bootstrapping,所以把它塞进一个函数或方法的某个地方.

但是,它绝对可能.


Sud*_*esh 11

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

在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);
Run Code Online (Sandbox Code Playgroud)

现在通过口才连接

MODEL::on('DB_CONFIG_NAME')->WHAT_EVER('1');
Run Code Online (Sandbox Code Playgroud)

你可以做一些Query Builder

$DB = DB::connection('DB_CONFIG_NAME');
Run Code Online (Sandbox Code Playgroud)

$DB->select()现在查询.

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


小智 5

有一个更简单的解决方案.如果您使用的是Larave 4,那么有一个选项对我有用.最近他们添加了你可以在模型中指定的$ table变量.请参阅此链接.

class User extends Eloquent {

    protected $table = 'my_users';

}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MySQL,则可以执行以下操作:

class User extends Eloquent {

    protected $table = 'mydbname.my_users';

}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是SQL Server,则可以执行以下操作:

class User extends Eloquent {

    protected $table = 'mydatabase..my_users';

}
Run Code Online (Sandbox Code Playgroud)

我的Config文件指定了DB1但我创建了一个想要在同一个MySQL主机中访问DB2的模型.所以这是一种快速而肮脏的方法来实现这一目标.

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

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

SELECT * from db2.mytable where id = 1;
Run Code Online (Sandbox Code Playgroud)