Php 如何在Laravel 6中删除数据库?
所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以用标准CRUD操作管理所有这些租户。我希望能够在删除租户时删除租户数据库,但我在文档中似乎找不到任何关于能够这样做的信息,也找不到API文档中可以使用的一系列方法 我已经在网上看到了下面的内容(我能找到的唯一信息),但是已经有2年了,但是所有这些方法要么已经被弃用,要么已经在Laravel 6中移动了Php 如何在Laravel 6中删除数据库?,php,mysql,database,laravel,laravel-6,Php,Mysql,Database,Laravel,Laravel 6,所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以用标准CRUD操作管理所有这些租户。我希望能够在删除租户时删除租户数据库,但我在文档中似乎找不到任何关于能够这样做的信息,也找不到API文档中可以使用的一系列方法 我已经在网上看到了下面的内容(我能找到的唯一信息),但是已经有2年了,但是所有这些方法要么已经被弃用,要么已经在Laravel 6中移动了 Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase(“
Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase(“{$database\u name}”;
通过我自己的测试,运行以下命令确实有效
语句('DROP DATABASE'foo`');
但我不能将变量绑定到此语句:
DB::语句(DB::raw('DROP DATABASE?',$DATABASE_name));
我还想使用标准的Laravel查询生成器,而不是自己清理信息。因此,理想情况下,我希望能够做到以下几点:
DatabaseManager::dropDatabase($database\u name);
或者这个:
$database=DatabaseManager::connect($database\u name);
$database->dropDatabase();
我猜我需要创建一个到MySQL的新连接,而不是直接连接到单个数据库。然后执行命令删除数据库,然后关闭连接
我将期待建立这个自己,但只是想知道是否有人对这一点有任何想法,或者无论如何,如果已经这样做过吗?非常感谢您的帮助。您可以创建一个laravel命令来删除数据库。e、 g: php artisan db:删除$database\u名称
要从表中删除记录,请执行以下操作:
DB::table('table_name')->delete();
如果希望截断整个表(这将删除所有行并将自动递增ID重置为零),可以使用truncate方法:
DB::table('table_name')->truncate();
或者使用Schema::dropIfExists('table_name')删除表代码>
删除数据库Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase(“数据库”)代码>调查结果
经过一些研究和修补,我有两个选择
1.理论数据库
我查看了Doctrine DBAL库,找到了我想要的东西。用于管理命令执行的库
它使用起来很简单,正如上面问题中提到的,您需要执行这段代码:
Schema::getConnection()->getDoctrineSchemaManager()->dropDatabase(“{$database\u name}”;
注意:为此,您首先需要通过composer请求库:
composer require doctrine/dbal
深入研究此方法后,它确实不值得额外的代码,更不用说包含库了,因为它执行的代码如下所示:
/**
*返回用于删除现有数据库的SQL代码段。
*
*@param string$database应删除的数据库的名称。
*/
公共函数getDropDatabaseSQL(字符串$database):字符串
{
返回'DROP DATABASE'。$DATABASE;
}
这与选项2中的操作完全相同
2.Laravel DB::语句()
这种方法做的事情完全相同,而且简单得多。所需的只是以下代码:
DB::语句(“DROP DATABASE`{$DATABASE\u name}`”;
结论
TLDR;使用Laravel的DB Facade来实现这一点,而不是使用第三方解决方案。它更清晰、更容易,并且使用更少的代码
现在我知道,正如@Rwd所指出的,这样做可能没有太多的理由,但我将以某种方式使用它,以便自动化清除冗余数据库的过程。我可能会构建某种形式的容器DatabaseManager,其中每个管理器将包含数据库信息的基于实例的版本,并包括处理数据库删除的方法
感谢@Rwd和@apokryfos的讨论
开放式终端
2.复制/粘贴
$ php artisan db:wipe
味精
“已成功删除所有表。”数据库用户是否确实有删除数据库的权限?我刚刚使用DB::statement(…)
进行了测试,似乎效果不错。@Rwd是的,用户肯定有权限。经过测试,它可以工作,但我不能做的是将一个变量绑定到语句中,这就是我想说的。我现在就更新这个问题。好的,你不能替换表名。@Rwd如果不能,那就好了。我仍然不想成为处理进入查询的数据库名称的清理的人。1.看起来很脏。安全,和3。Laravel已经有了这个惊人的数据库库,当然这是它可以处理的(即使只需要一点工作)?Backtick转义就足以清理数据库/表/列名,据我所知。另外,带有参数的预处理语句的目的是清理用户输入,因为我们不信任用户。你真的希望像数据库删除这样的事情由网站客户端来完成吗?(我不是说你不应该,我只是说这是你需要认真考虑的事情)这不是我想做的,我想使用Laravel QueryBuilder来使用更好的标准。好的。如果你将来能找到类似的东西,请在这个帖子中发布。best of luckI需要能够删除数据库,但谢谢。:)我已经发布了解决方案,你也会在问题中发现你的更正。不过谢谢。:)谢谢你的回答。我自己用最后找到的解决办法回答了这个问题。从那以后,我就放弃了这个想法,因为它从一开始就不是一个好主意。
$ php artisan db:wipe