Php 如何在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(“

所以我有一个问题,我有一个多租户应用程序,我有一个系统,我可以用标准CRUD操作管理所有这些租户。我希望能够在删除租户时删除租户数据库,但我在文档中似乎找不到任何关于能够这样做的信息,也找不到API文档中可以使用的一系列方法

我已经在网上看到了下面的内容(我能找到的唯一信息),但是已经有2年了,但是所有这些方法要么已经被弃用,要么已经在Laravel 6中移动了

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名称

  • php artisan make:命令dbDrop
  • 内部命令/dbDrop.php:


  • 要从表中删除记录,请执行以下操作:

    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