Laravel同时连接多个数据库,你用啥办法?

引言在巩固了基础知识之后,我们把目标转向框架的学习 。Laravel 是一个全球流行的框架,开发者和使用者都比较活跃,周边有许多库,和第三方资源均提供了支持 。

Laravel同时连接多个数据库,你用啥办法?

文章插图
 
今天说一下,如何在框架里同时连接多个数据库?
学习时间为什么需要连接多个数据库呢?因为,应用程序和数据库有可能不在同一台服务器 。而数据库服务器,并不能包含所有的业务表 。所以经过拆分的数据库需要我们建立多个连接 。
一般我们在 .env 文件内指定本地或者线上使用的配置项 。这样做比较灵活,很容易区分出不同的设置 。
首先我们在 .env 文件内添加如下配置:
DB_CONNECTION=MySQLDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=database1DB_USERNAME=rootDB_PASSword=secretDB_CONNECTION_SECOND=mysqlDB_HOST_SECOND=127.0.0.1DB_PORT_SECOND=3306DB_DATABASE_SECOND=database2DB_USERNAME_SECOND=rootDB_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从数据库连接配置,到程序内使用的方方面面 。还没有体验这个框架的同学,你真的值得一试了 。

【Laravel同时连接多个数据库,你用啥办法?】


    推荐阅读