oga*_*agh 2 php mysql database laravel laravel-6
所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以用标准的 CRUD 操作管理所有这些租户。我希望能够在租户被删除时删除租户数据库,但我似乎在文档中找不到任何关于能够执行此操作的内容,也找不到可以使用的 API 文档中的一系列方法。
我在网上看到了以下内容(我能找到的唯一信息),但它已有 2 年历史,但所有这些方法要么已被弃用,要么已在 Laravel 6 中移动。
Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");
Run Code Online (Sandbox Code Playgroud)
通过我自己的测试,运行以下命令确实有效。
DB::statement('DROP DATABASE `foo`');
Run Code Online (Sandbox Code Playgroud)
我不能做的是将变量绑定到这个语句:
DB::statement(DB::raw('DROP DATABASE ?', $database_name));
Run Code Online (Sandbox Code Playgroud)
我还想使用标准的 Laravel 查询构建器,而不是自己清理信息。所以理想情况下,我希望能够做这样的事情:
DatabaseManager::dropDatabase($database_name);
Run Code Online (Sandbox Code Playgroud)
或这个:
$database = DatabaseManager::connect($database_name);
$database->dropDatabase();
Run Code Online (Sandbox Code Playgroud)
我的猜测是我需要创建一个到MySQL的新连接,我没有直接连接到单个数据库。然后执行命令删除数据库,然后关闭连接。
我将寻求自己构建它,但只是想知道是否有人对此有任何想法,或者之前是否已经这样做过?非常感谢所有帮助。
经过一番研究和修改后,我有两个选择。
我查看了 Doctrine DBAL 库,并找到了我正在寻找的东西。管理命令执行的库。
使用起来很简单,正如上面问题中提到的,你需要执行这段代码:
Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");
Run Code Online (Sandbox Code Playgroud)
注意:为了做到这一点,您首先需要通过 Composer 请求该库:
composer require doctrine/dbal
Run Code Online (Sandbox Code Playgroud)
深入研究这个方法后,它确实不值得额外的代码,更不用说包含库了,因为它执行的代码如下[github]:
composer require doctrine/dbal
Run Code Online (Sandbox Code Playgroud)
这与您在选项 2 中所做的完全相同。
这个方法的作用完全一样,而且简单得多。所需要的只是以下代码:
/**
* Returns the SQL snippet to drop an existing database.
*
* @param string $database The name of the database that should be dropped.
*/
public function getDropDatabaseSQL(string $database) : string
{
return 'DROP DATABASE ' . $database;
}
Run Code Online (Sandbox Code Playgroud)
太长了;使用 Laravel 的 DB Facade 而不是第三方解决方案来完成此操作。它更清晰、更简单,并且使用的代码更少。
现在我知道这样做可能没有太多理由,正如 @Rwd 指出的那样,但我将寻求以某种方式使用它,以便自动执行清除冗余数据库的过程。我可能会构建某种形式的容器 DatabaseManager,其中每个管理器将包含一个基于实例的数据库信息版本,并包含一个处理数据库删除的方法。
感谢@Rwd 和@apokryfos 的讨论。
| 归档时间: |
|
| 查看次数: |
5274 次 |
| 最近记录: |