【发布时间】:2020-01-09 11:23:51
【问题描述】:
所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以使用标准 CRUD 操作管理所有这些租户。我希望能够在租户被删除时删除租户数据库,但我似乎在文档中找不到任何关于能够做到这一点的内容,我也无法在 API 文档中找到一系列可以使用的方法。
我在网上看到了以下内容(我能找到的唯一信息),但它已有 2 年历史,但所有这些方法要么已被弃用,要么已在 Laravel 6 中移动。
Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase("`{$database_name}`");
通过我自己的测试,运行以下命令确实有效。
DB::statement('DROP DATABASE `foo`');
我不能做的是将一个变量绑定到这个语句:
DB::statement(DB::raw('DROP DATABASE ?', $database_name));
我还想使用标准的 Laravel 查询构建器,而不是自己清理信息。所以理想情况下,我希望能够做这样的事情:
DatabaseManager::dropDatabase($database_name);
或者这个:
$database = DatabaseManager::connect($database_name);
$database->dropDatabase();
我的猜测是我需要创建一个到 MySQL 的新连接,而我没有直接连接到单个数据库。然后执行命令删除数据库,然后关闭连接。
我将自己构建这个,但只是想知道是否有人对这个有任何想法,或者是否以前做过这个?非常感谢所有帮助。
【问题讨论】:
-
db 用户肯定有删除数据库的权限吗?我刚刚使用
DB::statement(...)进行了测试,这似乎工作正常。 -
@Rwd 是的,用户肯定有权限。刚刚测试并且它有效,我不能做的是将变量绑定到语句是我的意思。我现在会更新问题。
-
AFAIK,您不能替换表名。
-
@Rwd 没关系。我仍然不想成为处理进入查询的数据库名称的清理工作的人。 1. 看起来很脏,2. 安全性,3. Laravel 已经有了这个惊人的数据库库,这肯定是它可以处理的(即使是一点点工作)?
-
据我所知,反引号转义足以清理数据库/表/列名称。此外,带有参数的预处理语句的目的是清理用户输入,因为我们不信任用户。您真的希望网站客户端完成诸如数据库删除之类的操作吗? (我不是说你不应该我只是说这是你需要非常认真考虑的事情)
标签: php mysql database laravel laravel-6