我的 Laravel 8 项目有两个数据库:DB_COMMON 和 DB_SYSTEM。关键是,我想分离敏感数据以避免删除,因此我将使用一个 db_user(具有所有权限)作为 DB_COMMON,使用另一个 db_user(不删除或更新权限)作为 DB_SYSTEM。它会是这样的额外的安全层。
还有表/(-s),例如,rbac_role。我想在DB_SYSTEM中存储两个角色作为“系统”(S_ADMIN和CUSTOMER),并允许用户在相同的表名(rbac_role)中创建新角色,但在DB_COMMON中。通常我想在一个地方(一个模型)处理这些角色。
有什么办法可以做到吗?
或者,也许我可以在模型中“推动”这两个角色?我的意思是将数据库表中的行与模型中我的(甚至可能是硬编码的)行合并?
首先,您必须在
config/database.php
文件中创建两个单独的连接。
mysql
如果您使用 mysql 数据库,则默认连接。
复制该参数并创建新连接:
'connection2' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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', ''),
...
],
然后您可以指定任何模型在特定连接上运行:
class RoleModel extends Model {
protected $connection = 'connection2';
...
}
当您调用
RoleModel
时,它将连接到第二个数据库。
我没有完全得到你想要的,但是如果你想从两个数据库中选择行,你可以动态设置
connection
并从任何表中选择行。
$first_rows = RoleModel::setConnection('mysql')->select('id', 'role')->get();
$second_rows = RoleModel::setConnection('connection2')->select('id', 'role')->get();
$combined_rows = $first_rows->merge($second_rows);
如果您想在第二个连接中创建新行,具体取决于第一个连接中是否存在相同的记录:
if(RoleModel::setConnection('mysql')->where('role', 'somerole')->exists()){
RoleModel::setConnection('connection2')->create([
'role' => 'somerole'
]);
}
希望这个答案对你有帮助
除了数据库中的实例之外,我还需要集成静态实例。我想到了使用 RO 数据库的完全相同的解决方案。您找到在模型上集成 2 个数据库的方法了吗?
这可以通过动态切换查询的连接来实现全局范围。