我想在我的系统中合并多个数据库。大多数时候数据库是mysql;但将来可能会有所不同,管理员可以生成这样的报表,这是异构数据库系统的使用来源。所以我的问题是,拉威尔是否提供了任何门面来处理这种情况?或者其他任何一个框架都有更适合问题的功能是什么?
2jcobegt1#
laravel内置了对多个数据库系统的支持,您需要在config/database.php文件中提供连接细节
return [ 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ], 'mysqlOne' => [ 'driver' => 'mysql', 'host' => env('DB_HOST_ONE', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE_ONE', 'forge'), 'username' => env('DB_USERNAME_ONE', 'forge'), 'password' => env('DB_PASSWORD_ONE', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ], ];
一旦您有了这个,您就可以为每个连接创建两个基本模型类,并在这些模型中定义连接名称
//BaseModel.php protected $connection = 'mysql'; //BaseModelOne.php protected $connection = 'mysqlOne';
您可以扩展这些模型,为每个数据库中的表创建更多的模型。
gk7wooem2#
您也可以使用postgres fdw系统https://www.postgresql.org/docs/9.5/postgres-fdw.html你可以在postgres中连接不同的数据库。之后,在一个查询中,可以访问不同数据库中的表。
vq8itlhq3#
在 .env ```DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=database1DB_USERNAME=rootDB_PASSWORD=secret
.env
DB_CONNECTION_SECOND=mysqlDB_HOST_SECOND=127.0.0.1DB_PORT_SECOND=3306DB_DATABASE_SECOND=database2DB_USERNAME_SECOND=rootDB_PASSWORD_SECOND=secret
在 `config/database.php` ``` 'mysql' => [ 'driver' => env('DB_CONNECTION'), 'host' => env('DB_HOST'), 'port' => env('DB_PORT'), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), ], 'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'host' => env('DB_HOST_SECOND'), 'port' => env('DB_PORT_SECOND'), 'database' => env('DB_DATABASE_SECOND'), 'username' => env('DB_USERNAME_SECOND'), 'password' => env('DB_PASSWORD_SECOND'), ],
注:在 mysql2 如果db\u用户名和db\u密码相同,则可以使用 env('DB_USERNAME') 这是在 .env 前几行。
mysql2
env('DB_USERNAME')
定义连接 app/config/database.php ```return array(
app/config/database.php
'default' => 'mysql', 'connections' => array( # Primary/Default database connection 'mysql' => array( 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'database1', 'username' => 'root', 'password' => 'secret' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), # Secondary database connection 'mysql2' => array( 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'database2', 'username' => 'root', 'password' => 'secret' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ),
);
架构 要指定要使用的连接,只需运行 `connection()` 方法
Schema::connection('mysql2')->create('some_table', function($table){$table->increments('id'):});
查询生成器
$users = DB::connection('mysql2')->select(...);
雄辩的 设置 `$connection` 模型中的变量
class SomeModel extends Eloquent {
protected $connection = 'mysql2';
}
您还可以在运行时通过 `setConnection` 方法或 `on` 静态方法:
class SomeController extends BaseController {
public function someMethod() { $someModel = new SomeModel; $someModel->setConnection('mysql2'); // non-static method $something = $someModel->find(1); $something = SomeModel::on('mysql2')->find(1); // static method return $something; }
注意:在尝试跨数据库与表建立关系时要小心!这是可以做到的,但它可能会附带一些警告,并取决于您的数据库和/或数据库设置。 ## 来自laravel docs 使用多个数据库连接 使用多个连接时,可以访问每个连接 `connection` 通过上的连接方法 `DB` 外观。这个 `name` 传递给 `connection` 方法应该对应于 `config/database.php` 配置文件:
$users = DB::connection('foo')->select(...);
您还可以在连接示例上使用getpdo方法访问原始的基础pdo示例:
$pdo = DB::connection()->getPdo();
有用的链接 来自的laravel 5多个数据库连接 `laracasts.com` 从连接laravel中的多个数据库 `tutsnare.com` 来自的laravel中的多个db连接 `fideloper.com`
5cg8jx4n4#
事实上, DB::connection('name')->select(..) 不适用于我,因为“name”必须用双引号引起来:“name”不过,select查询是在我的默认连接上执行的。仍在试图弄清楚,如何说服拉威尔按预期的方式工作:改变连接。编辑:我想出来了。在调试laravels databasemanager之后,发现我的database.php(配置文件)(在$this->app中)是错误的。在“连接”一节中,我有“数据库”之类的东西,它们的值是我从中复制的。明确地说,而不是
DB::connection('name')->select(..)
env('DB_DATABASE', 'name')
我需要放置一些
'myNewName'
因为列出的所有连接都具有相同的数据库值、用户名、密码等。如果我想至少访问另一个数据库名称,这当然没有什么意义因此,每次我想从另一个数据库中选择一些东西时,我总是以默认数据库结束
cnwbcb6i5#
在laravel 5.1中,指定连接:
默认情况下,laravel使用默认连接。很简单,不是吗?阅读更多信息:http://laravel.com/docs/5.1/database#accessing-连接
5条答案
按热度按时间2jcobegt1#
laravel内置了对多个数据库系统的支持,您需要在config/database.php文件中提供连接细节
一旦您有了这个,您就可以为每个连接创建两个基本模型类,并在这些模型中定义连接名称
您可以扩展这些模型,为每个数据库中的表创建更多的模型。
gk7wooem2#
您也可以使用postgres fdw系统
https://www.postgresql.org/docs/9.5/postgres-fdw.html
你可以在postgres中连接不同的数据库。之后,在一个查询中,可以访问不同数据库中的表。
vq8itlhq3#
使用.env>=5.0(在5.5上测试)
在
.env
```DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret
注:在
mysql2
如果db\u用户名和db\u密码相同,则可以使用env('DB_USERNAME')
这是在.env
前几行。无.env<5.0
定义连接
app/config/database.php
```return array(
);
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
$users = DB::connection('mysql2')->select(...);
class SomeModel extends Eloquent {
}
class SomeController extends BaseController {
}
$users = DB::connection('foo')->select(...);
$pdo = DB::connection()->getPdo();
5cg8jx4n4#
事实上,
DB::connection('name')->select(..)
不适用于我,因为“name”必须用双引号引起来:“name”不过,select查询是在我的默认连接上执行的。仍在试图弄清楚,如何说服拉威尔按预期的方式工作:改变连接。
编辑:我想出来了。在调试laravels databasemanager之后,发现我的database.php(配置文件)(在$this->app中)是错误的。在“连接”一节中,我有“数据库”之类的东西,它们的值是我从中复制的。明确地说,而不是
我需要放置一些
因为列出的所有连接都具有相同的数据库值、用户名、密码等。如果我想至少访问另一个数据库名称,这当然没有什么意义
因此,每次我想从另一个数据库中选择一些东西时,我总是以默认数据库结束
cnwbcb6i5#
在laravel 5.1中,指定连接:
默认情况下,laravel使用默认连接。很简单,不是吗?
阅读更多信息:http://laravel.com/docs/5.1/database#accessing-连接