Laravel 动态切换数据库链接

1.问题背景

在我们的工作需求中,一般一个项目一份代码,链接一个数据库就足够了。

但是如果我们有多个车辆系统A,车辆系统B,车辆系统C,虽然名称不通,在客户眼中也是两个项目,但是其实这些项目在程序员的眼中是几乎相同的,可以复用同样的代码,只是一些参数不通,数据存储的配置不通,甚至表结构 字段都是相同的。

如果我们还是创建了A,B,C.....项目那么以后的维护成本也会越来越大,同步一个功能,就更改N份代码,是不是很累?

我们是否可以在一套代码内通过某个参数来区分数据库的链接?是否可以通过这个参数,切换某些配置项?

2.通过Laravel框架尝试

大概流程就是,我们可以通过设置一个全局的中间件,去做配置。

(1)新建一个不同数据库配置方法

首先新建一个放置公共函数的文件

touch app/helpers.php

 然后,修改composer.json文件

"autoload": {
     ...
     "files": [
            "app/helpers.php"
         ]
}

 修改保存后运行以下命令进行重新加载文件即可

composer dump-autoload

 然后在其中增加一下配置方法

if(!function_exists("databaseConnection")){

    function databaseConnection($airportIata){
        $connections = [
            'd1'=>[
                'driver' => 'mysql',
                'host' => 'xxxxxxxx',
                'port' => 'xxx',
                'database' => 'xxxx',
                'username' => 'xxxxx',
                'password' => 'xxxx',
                'prefix' => 'xxx',
            ],
             'd2'=>[
                'driver' => 'mysql',
                'host' => 'xxxxxxxx',
                'port' => 'xxx',
                'database' => 'xxxx',
                'username' => 'xxxxx',
                'password' => 'xxxx',
                'prefix' => 'xxx',
            ],
             'd3'=>[
                'driver' => 'mysql',
                'host' => 'xxxxxxxx',
                'port' => 'xxx',
                'database' => 'xxxx',
                'username' => 'xxxxx',
                'password' => 'xxxx',
                'prefix' => 'xxx',
            ],
        ];
        if(isset($connections[$airportIata])){
            return $connections[$airportIata];
        }else{
            return [];
        }
    }

(2)创建中间件

php artisan make:middleware ChangeDatabase

 

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Config;

class ChangeDatabase
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        /**
         * 根据传递参数的参数 链接不同的数据库
         */
        if (!$request->para) {
            return response()->json(['msg'=>'缺少参数']);
        }
        $con = databaseConnection($request->airportIata);
        if (!$con) {
            return response()->json(['msg'=>'缺少参数']);
        }

        Config::set('database.connections.mysql', $con);
        return $next($request);
    }
}

 并将该中间件注册到 kernel.php

protected $routeMiddleware = [

....

'db.change'=>ChangeDatabase::class


]

(3)建立路由,以及控制器

Route::get('user/{user}',"UsersController@user")->name('user');
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Auth\ResetPasswordController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class UsersController extends Controller
{


    public function __construct()
    {
      $this->middleware('db.change');
    }

    public function user(Request $request){

        $user = DB::table('user')->where('uid','=',$request->user)->first();
        dd($user);

    }

}

https://laravel6.test/user/234?pa=d1

访问本地环境地址,通过改变pa的值,即可链接不同的数据库。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Laravel 中连接 MySQL 数据库需要进行以下配置: 1. 打开 `.env` 文件,设置数据库连接相关的环境变量,例如: ``` DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=your_database_name DB_USERNAME=your_database_username DB_PASSWORD=your_database_password ``` 2. 打开 `config/database.php` 文件,确认数据库配置是否正确,例如: ``` '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', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ``` 3. 如果你使用的是 MySQL 8.0 版本以上,需要修改 `config/database.php` 文件中的 `mysql` 配置,将 `'strict' => true` 改为 `'strict' => false`,否则会出现严格模式错误。 4. 如果你的 MySQL 服务器不在本地,需要确保你可以通过网络访问到 MySQL 服务器。你可以通过 telnet 命令测试 MySQL 服务器是否可用,例如:`telnet ip_address port`。 5. 最后,你可以在 Laravel 项目中测试数据库连接是否成功,例如: ``` Route::get('/test-database-connection', function() { try { DB::connection()->getPdo(); echo "Database connection is OK!"; } catch (\Exception $e) { die("Could not connect to the database. Please check your configuration. error:" . $e ); } }); ``` 如果运行该路由,输出 `Database connection is OK!`,则说明数据库连接成功。 ### 回答2: Laravel是一个流行的PHP框架,它提供了许多方便的功能和易于使用的工具,用于构建高效的Web应用程序。当我们使用Laravel时,需要连接数据库,一种常见的数据库选择是MySQL。 要在Laravel中连接MySQL数据库,我们需要进行一些配置步骤。首先,我们需要在项目的.env文件中设置数据库连接的相关配置。这可以通过在.env文件中设置DB_CONNECTION、DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME和DB_PASSWORD来完成。其中,DB_CONNECTION设置为mysql,DB_HOST设置为数据库的主机地址,DB_PORT设置为数据库的端口号,DB_DATABASE设置为要连接的数据库的名称,DB_USERNAME和DB_PASSWORD分别设置为数据库的用户名和密码。 配置完成后,我们可以在Laravel应用中使用数据库连接。通过Laravel自带的数据库查询构建器或Eloquent ORM,我们可以执行各种数据库操作,如插入、更新、删除和查询数据。 例如,如果要查询users表中的所有记录,我们可以使用以下代码: ``` $users = DB::table('users')->get(); ``` 这将返回一个包含所有用户记录的数组。 另外,我们还可以使用Eloquent ORM进行更高级的数据库操作。首先,我们需要创建一个与数据库表对应的模型。例如,如果要操作users表,我们可以创建一个User模型,然后定义表名等相关信息。然后,我们就可以使用模型类来执行各种数据库操作,如创建、保存、更新和删除记录。 总之,通过配置数据库连接信息,并使用Laravel提供的数据库查询构建器或Eloquent ORM,我们可以方便地在Laravel中连接和操作MySQL数据库。 ### 回答3: Laravel是一个流行的PHP框架,提供了许多便捷的功能和工具来简化开发过程。在Laravel中,连接MySQL数据库非常简单。 首先,确保已经安装了MySQL数据库并设置好了用户名和密码。然后,在Laravel的配置文件.env中,找到以下几个配置项: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=root DB_PASSWORD= 这些配置项用于指定数据库链接信息,其中的参数根据具体的情况进行修改。 - DB_CONNECTION 指定数据库驱动,这里设为mysql。 - DB_HOST指定数据库的主机地址,默认是127.0.0.1,本地地址。 - DB_PORT指定数据库的端口,默认是3306。 - DB_DATABASE指定要连接的数据库名称,这里设为homestead,可以根据实际情况修改。 - DB_USERNAME和DB_PASSWORD指定连接数据库的用户名和密码,默认为空。 完成以上配置后,Laravel将自动使用这些配置信息来连接MySQL数据库。 在Laravel中,可以使用数据库查询构建器来执行各种查询操作。查询构建器提供了一种在PHP代码中流畅、直观地编写SQL查询的方式。以下是一个简单的例子,演示了如何使用Laravel进行数据库查询: $users = DB::table('users')->where('name', 'John')->first(); 上述代码将从users表中选择名字为John的第一条记录,并将结果存储在$users变量中。使用DB::table()方法指定表名,然后使用where()方法来添加查询条件。 以上就是使用Laravel连接MySQL数据库的简单介绍。Laravel提供了更多高级的数据库操作功能,如ORM(对象关系映射),以及查询构建器支持的各种查询方法。通过合理地利用这些功能,可以更加方便地处理和管理数据库数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值