数据库|3分钟短文 | Laravel同时连接多个数据库,你用啥办法?

引言
在巩固了基础知识之后 , 我们把目标转向框架的学习 。 Laravel 是一个全球流行的框架 , 开发者和使用者都比较活跃 , 周边有许多库 , 和第三方资源均提供了支持 。
【数据库|3分钟短文 | Laravel同时连接多个数据库,你用啥办法?】
今天说一下 , 如何在框架里同时连接多个数据库?
学习时间
为什么需要连接多个数据库呢?因为 , 应用程序和数据库有可能不在同一台服务器 。 而数据库服务器 , 并不能包含所有的业务表 。 所以经过拆分的数据库需要我们建立多个连接 。
一般我们在 .env 文件内指定本地或者线上使用的配置项 。 这样做比较灵活 , 很容易区分出不同的设置 。
首先我们在 .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
当然 DB_HOST 可以是任何远程的数据库 , 或者本地的数据库资源 。 有多少个 , 就需要手动定义多少个 , 只是把常量加以区分 , 以便在程序内读取 。
接着在配置目录数据库配置项 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')
其中 “mysql”和“mysql2”就是数据库连接 $connection 的别名 , 用以区分不同的资源 。 如果方便记忆 , 可以使用诸如 “mysql_server_a”\"mysql_server_b\" 这样的符号 。
数据库操作
如果你遵循框架的数据库操作方式 , 首先是进行表的迁移 , 那么创建在 migrations 内 , 指定给那个数据库创建表 , 则需要这样写:
Schema::connection('mysql2')->create('some_table' function($table)
{
$table->increments('id'):
);
对于查询操作 , 使用原生的方式 , 需要明确指定从某个连接操作sql , 需要这样写:
$users = DB::connection('mysql2')->select(...);
当然了 , 我们不推荐在程序内进行原生sql操作 , 因为这样破坏了数据库表字段的可追溯性 , 也丧失了 Eloquent ORM 的强大功能 。
所以我们使用模型操作数据库 , 那么指定某个 Model 使用哪个数据库的哪个表 , 只需要在模型文件内显式声明:
class SomeModel extends Model
{
protected $connection = 'mysql2';
这样 , 程序内对于 SomeModel 的所有操作就都是针对 “mysql2”这个连接所指向的数据库 。
Laravel 的灵活还不止这一点半点 , 如果在Model内不指定$connection , 你还可以在控制器内 , 在命令行程序内 , 在队列内 , 在中间件内 , 在监听器内 , 都可以任意指定某个Model连接:
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2'); // 非静态方法
$something = $someModel->find(1);
$something = SomeModel::on('mysql2')->find(1); // 静态方法
return $something;
这样优雅灵活的用法 , 有没有眼前一亮!
写在最后
本文通过多种方法 , 演示了Laravel从数据库连接配置 , 到程序内使用的方方面面 。 还没有体验这个框架的同学 , 你真的值得一试了 。
Happy coding :-)
我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。
推荐阅读
- 科技日报|功能性玉米被端上餐桌 这个数据库帮了大忙
- 数据库|SQLite 3.33.0 发布,世界上使用量最大的数据库引擎
- 数据库|功能性玉米被端上餐桌 这个数据库帮了大忙
- 大米嘚啵嘚历史短文|世人皆知“负荆请罪”,却不知长平之战后,蔺相如、廉颇的下场
- 曾经把钱输光的他,3分钟写的写的一首歌,一值的销量都无人打破
- SQLite|SQLite 3.33.0 发布,世界上使用量最大的数据库引擎
- 3分钟学会科目三灯光操作,成都驾考课堂考试口诀
- 科学探索|德国曾经制造出飞碟,3分钟升到千米高空?德国投降后飞碟去哪了
- 摆摆鲸鱼君|八字短文案 漫漫星河 温暖人间
- 小玲美食记|发面饼怎样才蓬松柔软,不擀面不揉面,筷子一搅,3分钟就能出锅
