有时我希望连接到另一个数据库。
我创建了一个 config.php 文件并在其中填写了数据库连接数据。
但是我该如何告诉 Laravel 连接到这个数据库,而不是使用 config/database.php 中的设置呢?
比如,当使用 Schema
类时。
由于似乎没有人理解我的需求。
我不想使用 config/database.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) {})
这方面有更多的文档说明-请参见访问连接。
Eloquent ORM 您可以在Eloquent类中定义变量"connection"来设置使用哪个连接。这在基本用法部分中有说明。
在Github上查看该变量和可设置以动态方式设置连接的方法here。
编辑 原帖作者已明确表示不希望使用config/database.php文件进行配置。
但是如果没有进一步解释,我无法发表评论。我很乐意帮助-听起来了解为什么不能/不应该使用config/database.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);
现在通过Eloquent进行连接
MODEL::on('DB_CONFIG_NAME')->WHAT_EVER('1');
如果使用查询生成器,您可以执行以下操作
$DB = DB::connection('DB_CONFIG_NAME');
现在查询请使用$DB->select()
希望这能帮助正在寻找此问题可能解决方案的开发人员
App :: make('config') - > set('database.connections.DB_CONFIG_NAME',$ conn)
,结果相同。有什么想法吗? - Josip Rodin请记住,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();
这是一堆需要运行的引导程序,所以请将其嵌入到某个函数或方法中。
但它绝对是可能的。
有一个更简单的解决方案。如果你正在使用Laravel 4,那么有一个选项适用于我。最近他们添加了$table变量,你可以在你的模型中指定它。请参考这个链接。
class User extends Eloquent {
protected $table = 'my_users';
}
class User extends Eloquent {
protected $table = 'mydbname.my_users';
}
class User extends Eloquent {
protected $table = 'mydatabase..my_users';
}
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'),
));
'app/config/mymachine'
创建一个新路径。database.php
的副本。
Schema::connection('foo')->create('users', function($table)...
来使用名为 'foo' 的数据库。 - Joachim Isaksson