Laravel 中一个模型有两个表/默认(不可删除)行

问题描述 投票:0回答:2

我的 Laravel 8 项目有两个数据库:DB_COMMONDB_SYSTEM。关键是,我想分离敏感数据以避免删除,因此我将使用一个 db_user(具有所有权限)作为 DB_COMMON,使用另一个 db_user(不删除或更新权限)作为 DB_SYSTEM。它会是这样的额外的安全层。

还有表/(-s),例如,rbac_role。我想在DB_SYSTEM中存储两个角色作为“系统”(S_ADMIN和CUSTOMER),并允许用户在相同的表名(rbac_role)中创建新角色,但在DB_COMMON中。通常我想在一个地方(一个模型)处理这些角色。

有什么办法可以做到吗?

或者,也许我可以在模型中“推动”这两个角色?我的意思是将数据库表中的行与模型中我的(甚至可能是硬编码的)行合并?

php mysql database laravel eloquent
2个回答
1
投票

首先,您必须在

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'
  ]);
}

希望这个答案对你有帮助


0
投票

除了数据库中的实例之外,我还需要集成静态实例。我想到了使用 RO 数据库的完全相同的解决方案。您找到在模型上集成 2 个数据库的方法了吗?

这可以通过动态切换查询的连接来实现全局范围。

© www.soinside.com 2019 - 2024. All rights reserved.