之前一篇笔记写了拆分route.php文件,今天遇到一个情况,就是使用多个数据库来存放数据。
A业务需要存在A库,B业务需要存放在B库,而管理后台又需要单独存放一个数据库,于是就要用到Laravel的database配置。
一、数据库配置
在config/database.php
中的connections里有一段代码是配置默认数据库的:
| 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), '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, ], |
那么我们要把这段代码复制一份出来,其中host等参数都可以重新定义,我这里的需求只需要改动databse(库名)就可以了,所以我的代码是这样的:
| 'mysql_games' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE_GAMES', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ], |
配置名mysql
改为mysql_games
,databse读取env配置中的DB_DATABASE_GAMES
的值,接下来在.env
文件中增加一条DB_DATABASE_GAMES=库名
就可以了。
二、DB和Model配置
光是改了配置,但是在Model中怎么指定去读写哪个数据库呢?
在Model文件中加入下段代码即可指定该Model读写的是哪个数据库。
| protected $connection = 'mysql_games'; |
在使用DB的情况下,则使用下段示例代码来进行操作:
| DB::connection('mysql_games')->select(...); |
三、数据库迁移和数据填充
我们在正常开发中,会经常用laravel的迁移功能来构建线下和线上的数据表结构,那么在使用多个数据库的时候我们怎么来指定该迁移是对应哪个数据库的呢?
在写构建数据表代码的时候,像下段代码一样写即可:
| Schema::connection('mysql_games')->create('users', function (Blueprint $table) { // }); |
四、规则验证
在Laravel中为我们提供了一个验证服务,可以用来对表单数据等进行规则校验,其中有一个unique
验证方法,可以验证字段在给定数据表上必须是唯一的,这里也需要对数据表所属数据库进行指定,否则默认读mysql
配置的默认数据库。
| 'email' => 'unique:mysql_games.users,email_address' |
即unique:配置名.表名
好啦,大概就这么几点,自己学习备忘的同时,也希望可以帮助到更多正在学习Laravel框架的人。
来自 https://m.aoh.cc/173.html
问题描述
我想在我的系统中组合多个数据库。大多数时候数据库是MySQL;但在将来可能会有所不同,管理员可以生成使用异构数据库系统的源的报告。
那么我的问题是拉里维尔是否提供任何立面处理这种情况?还是任何其他框架都有更多的适合能力的问题呢?
最佳解决方案
定义连接
内部的数据库配置文件 – 可能是app/config/database.php
。
return array(
'default' => 'mysql',
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => 'host1',
'database' => 'database1',
'username' => 'user1',
'password' => 'pass1'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
'mysql2' => array(
'driver' => 'mysql',
'host' => 'host2',
'database' => 'database2',
'username' => 'user2',
'password' => 'pass2'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
);
架构
在Schema Builder中,您可以使用Schema facade与任何连接。要指定要使用的连接,只需运行connection()
方法:
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
询问
与Schema Builder类似,您可以在查询生成器上定义一个连接:
$users = DB::connection('mysql2')->select(...);
雄辩
您还可以定义在您的雄辩模型中使用的连接!
一种方法是在您的模型中设置$connection
变量:
<?php
class SomeModel extends Eloquent {
protected $connection = 'mysql2';
}
您还可以通过setConnection
方法在运行时定义连接
<?php
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2');
$something = $someModel->find(1);
return $something;
}
}
Note Be careful about attempting to build relationships with tables across databases! It is possible to do, but it can come with some caveats and depends on what database and/or database settings you have.
使用多个数据库连接
使用多个连接时,可以通过DB
立面上的连接方法访问每个connection
。传递给connection
方法的name
应对应于config/database.php
配置文件中列出的连接之一:
$users = DB::connection('foo')->select(...);
您还可以使用连接实例上的getPdo方法访问原始的基础PDO实例:
$pdo = DB::connection()->getPdo();
有用的链接
Source
Laravel 5多数据库连接从laracasts.com
从tutsnare.com
连接laravel中的多个数据库
次佳解决方案
在Laravel 5.1中,指定连接:
$users = DB::connection('foo')->select(...);
默认情况下,Laravel使用默认连接。很简单,不是吗?
在这里阅读更多:http://laravel.com/docs/5.1/database#accessing-connections
参考文献
注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。