ikechukwukalu / dynamicdatabaseconfig
这是一个laravel包,帮助您动态设置数据库配置。
Requires
- php: >=7.3
- illuminate/console: ^8.0|^9.0|^10.0|^11.0
- illuminate/database: ^8.0|^9.0|^10.0|^11.0
- illuminate/http: ^8.0|^9.0|^10.0|^11.0
- illuminate/routing: ^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.0|^2.0
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- php-parallel-lint/php-parallel-lint: dev-develop
- phpunit/phpunit: ^9.0|^10.0|^11.0
README
这个laravel包可以帮助您通过.env
文件或database
动态设置更多数据库配置。
需求
- PHP 8.0+
- Laravel 9+
安装步骤
composer require ikechukwukalu/dynamicdatabaseconfig
简介
这个包的需求是在我处理一个已经存在的项目时出现的,由于某些限制,这个项目为每个使用该应用程序的国家实施了9个数据库。这个应用程序还有一个所有国家都使用的中心数据库。
config/database文件看起来并不美观。我更愿意所有配置都在.env
文件中。最大的问题是,如果数据库需求增长到19个怎么办?这些都是需要解决的待办事项和现有问题。
中间件
env.database.config
dynamic.database.config
Env.database.config
中间件
这个中间件使用后缀如ONE
从.env
文件中获取数据库配置。这可以动态地为您的laravel应用程序声明额外的数据库连接。
- 示例env配置
DB_HOST_ONE=127.0.0.1 DB_PORT_ONE=3306 DB_DATABASE_ONE=second_db DB_USERNAME_ONE=root DB_PASSWORD_ONE=
- 示例中间件实现
use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; /** * mysql is the type of relational database connection being replicated - $database * mysql_1 is the new connection name - $name * ONE is the postfix - $postfix */ Route::middleware(['env.database.config:mysql,mysql_1,ONE'])->group(function () { Route::post('/user', function (Request $request) { /** * $request->_db_connection === 'mysql_1' */ return \App\Models\User::on('mysql_1')->find(1); }); }); Route::post('/user', function (Request $request) { /** * $request->_db_connection === 'mysql_1' */ return \App\Models\User::on('mysql_1')->find(1); })->middleware('env.database.config:mysql,mysql_1,ONE');
如果您只需要设置以下会话值session(config('dynamicdatabaseconfig.session_postfix'))
,则不需要为中间件的$postFix
变量添加后缀参数ONE
,但如果设置了后缀参数,则将使用该参数而不是会话值。
Dynamic.database.config
中间件
这个中间件从主迁移数据库中的database_configurations
表获取数据库配置。它使用一个独特的$ref
变量。建议将独特的$ref
变量设置为人类可读的,这样更容易运行包的console命令来运行迁移。这将为您的laravel应用程序动态声明额外的数据库连接。
- 模型文件
use Ikechukwukalu\Dynamicdatabaseconfig\Models\DatabaseConfiguration; protected $hidden = [ 'ref', 'name', 'database', /** * Accepts only arrays */ 'configuration' ];
- 示例eloquent数据库插入
$countries = ['nigeria', 'ghana', 'togo', 'kenya']; $config = \Config::get('database.connections.mysql'); foreach ($countries as $country) { $config['database'] = $country . '_db'; DatabaseConfiguration::firstOrCreate( ['ref' => $country], [ 'ref' => $country, 'name' => 'mysql_' . $country, 'database' => 'mysql', 'configuration' => $config ]); }
- 示例中间件实现
use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; /** * nigeria is $ref value */ Route::middleware(['dynamic.database.config:nigeria'])->group(function () { Route::post('/user', function (Request $request) { /** * $request->_db_connection === 'mysql_nigeria' */ return \App\Models\User::on('mysql_nigeria')->find(1); }); }); Route::post('/user', function (Request $request) { /** * $request->_db_connection === 'mysql_nigeria' */ return \App\Models\User::on('mysql_nigeria')->find(1); })->middleware('dynamic.database.config:nigeria');
如果您只需要设置以下会话值session(config('dynamicdatabaseconfig.session_ref'))
,则不需要为中间件的$ref
变量添加参数nigeria
,但如果设置了ref参数,则将使用该参数而不是会话值。
默认情况下,存储在configuration
字段中的值将被加密,但您可以通过设置.env
文件中的DB_CONFIGURATIONS_HASH=false
来调整这一点。
迁移
首先迁移laravel的初始数据库是强制性的。
php artisan migrate
其他迁移
- 默认迁移
- 隔离迁移
默认迁移
这将只迁移laravel默认迁移路径database/migrations
中的文件。
php artisan env:migrate mysql mysql_1 ONE php artisan dynamic:migrate nigeria
隔离迁移
这将只迁移指定迁移路径database/migrations/folder
中的文件。
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder php artisan dynamic:migrate nigeria --path=database/migrations/folder
两者迁移
运行以下迁移将导致相应的数据库具有来自database/migrations
和database/migrations/folder
中迁移的数据。
php artisan env:migrate mysql mysql_1 ONE php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder php artisan dynamic:migrate nigeria php artisan dynamic:migrate nigeria --path=database/migrations/folder
具有播种的数据库迁移
php artisan env:migrate mysql mysql_1 ONE --seed php artisan env:migrate mysql mysql_1 ONE --seeder=DatabaseSeederOne php artisan env:migrate mysql mysql_1 ONE --seeder=DatabaseSeederOne --path=database/migrations/folder php artisan dynamic:migrate nigeria --seed php artisan dynamic:migrate nigeria --seeder=DatabaseSeederNigeria php artisan dynamic:migrate nigeria --seeder=DatabaseSeederNigeria --path=database/migrations/folder
重新运行迁移
php artisan env:migrate mysql mysql_1 ONE --fresh php artisan env:migrate mysql mysql_1 ONE --fresh --seed php artisan env:migrate mysql mysql_1 ONE --fresh --seeder=DatabaseSeederOne php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --fresh php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --fresh --seeder=DatabaseSeederOne php artisan dynamic:migrate nigeria --fresh php artisan dynamic:migrate nigeria --fresh --seed php artisan dynamic:migrate nigeria --fresh --seeder=DatabaseSeederNigeria php artisan dynamic:migrate nigeria --path=database/migrations/folder --fresh php artisan dynamic:migrate nigeria --path=database/migrations/folder --fresh --seeder=DatabaseSeederNigeria
刷新迁移
php artisan env:migrate mysql mysql_1 ONE --refresh php artisan env:migrate mysql mysql_1 ONE --refresh --seed php artisan env:migrate mysql mysql_1 ONE --refresh --seeder=DatabaseSeederOne php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --refresh php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --refresh --seeder=DatabaseSeederOne php artisan dynamic:migrate nigeria --refresh php artisan dynamic:migrate nigeria --refresh --seed php artisan dynamic:migrate nigeria --refresh --seeder=DatabaseSeederNigeria php artisan dynamic:migrate nigeria --path=database/migrations/folder --refresh php artisan dynamic:migrate nigeria --path=database/migrations/folder --refresh --seeder=DatabaseSeederNigeria
回滚迁移
php artisan env:migrate mysql mysql_1 ONE --rollback php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --rollback php artisan dynamic:migrate nigeria --rollback php artisan dynamic:migrate nigeria --path=database/migrations/folder --rollback
数据库播种
php artisan env:seed mysql mysql_1 ONE --seed php artisan env:seed mysql mysql_1 ONE --seeder=DatabaseSeederOne php artisan dynamic:seed nigeria --seed php artisan dynamic:seed nigeria --seeder=DatabaseSeederNigeria
注意
- 在迁移任何其他数据库之前,需要先迁移主数据库。
- 如果不存在,将会创建数据库。
- 每个数据库将保留自己的独立
migration
表。 - 建议您不要发布包的迁移文件,除非您想将
database_configurations
表迁移到运行 默认迁移 时创建的每个额外数据库中。
发布迁移
php artisan vendor:publish --tag=ddc-migrations
发布配置
php artisan vendor:publish --tag=ddc-config
许可证
DDC包是一个开源软件,根据 MIT许可证 授权。