我有时想连接到另一个数据库。
我用数据库连接数据创建了一个 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) {})
有更多关于此的文档 - 请参阅Accessing Connections。
Eloquent ORM 您可以在 eloquent 类中为“连接”定义变量来设置使用哪个连接。基本用法部分对此进行了说明。
在 Github上查看该变量以及您可以在此处设置动态设置连接的方法。
编辑 OP 已经明确表示他们不希望使用 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()
查询。
希望这将帮助开发人员为这个问题寻找可能的解决方案
请记住,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。所以这是一种快速而肮脏的方式来实现这一点。
现在我并没有一直充分利用 Eloquent ORM,所以这个“hack”可能不适用于多对多或一对多 Eloquent 方法。
我有另一个想法,但我实际上并没有尝试过在 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
您的应用程序目录中的简单 php 文件在哪里src/config
返回一个数组,其中包含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
添加带有新配置参数的副本。