如何使用Laravel模型创建新的空数据库

5

有没有办法使用Laravel CodeBehind创建新的数据库?我的意思是,我不能使用php artisan或类似的工具。只因为我想为每个注册用户创建一个数据库。之后我可以使用migration。

我正在使用Laravel 5.2。

谢谢您的支持。


好的,那么针对某个表中的每个用户,您想要为其创建一个数据库? - PlayMa256
是的,我有一个通用的数据库来存储注册用户。但是我需要为每个用户创建一个新的数据库。 - Yasin Yörük
这种解决方案被称为“多租户”,这里有一篇文章描述了它多租户数据架构 - UselesssCat
@ArieCwHat 感谢提供这份文档。我之前已经阅读过了。但是我现在将我的项目改为服务模式。 - Yasin Yörük
5个回答

4
你可以通过像这样传递dbname来从控制器创建尽可能多的数据库
public function index() {
    $userName = 'bigboytr';  // Your Database name to be created
    DB::statement("CREATE DATABASE $userName");
}

警告:

您不需要为每个用户创建一个数据库,因为这会使系统变得非常复杂。例如,如果您有数千名用户,在某些情况下,将用户信息移动到已注册用户的“通用”数据库中将非常困难。

建议:

我建议您为未注册用户创建一个新表,以便您可以将它们移动到已注册用户的表中,这将使您的过程更加容易。

提示:

您可以比较数据库引擎并选择最适合您的匹配,例如此链接


3
为此,您可以创建一个Artisan命令

步骤1:创建命令

php artisan make:command CreateDatabaseCommand

步骤2:在 app/Console/Kernel.php 中注册命令。
protected $commands = [
    CreateDatabaseCommand::class
];

步骤3:在您的CreateDatabaseCommand.php文件中编写逻辑。
protected $signature = 'make:database {dbname} {connection?}';

    public function handle()
    {
     try{
         $dbname = $this->argument('dbname');
         $connection = $this->hasArgument('connection') && $this->argument('connection') ? $this->argument('connection'): DB::connection()->getPDO()->getAttribute(PDO::ATTR_DRIVER_NAME);

         $hasDb = DB::connection($connection)->select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = "."'".$dbname."'");

         if(empty($hasDb)) {
             DB::connection($connection)->select('CREATE DATABASE '. $dbname);
             $this->info("Database '$dbname' created for '$connection' connection");
         }
         else {
             $this->info("Database $dbname already exists for $connection connection");
         }
     }
     catch (\Exception $e){
         $this->error($e->getMessage());
     }
   }

现在你可以像这样调用你准备好的Artisan命令。
php artisan make:database {database-name} {connection-name}

请查看我的示例

enter image description here


2

你可以为每个bd执行一次数据库查询,然后使用mysql或sgbd数据库创建命令。

  DB::getConnection()->statement('CREATE DATABASE :schema', array('schema' => "dasdsdasdsadsadsa"))

它可能适用于您想要的内容。

是的,这很简单并解决了我的问题。感谢您和所有回答或评论我的问题的人。 - Yasin Yörük
不兼容Laravel 9。 - Limitless Claver

0

你可以从代码中运行 artisan 命令

Artisan::call('migrate');

要运行composer命令(您需要它来注册迁移),请使用php shell_exec

shell_exec('composer dumpauto');

我会尝试,但现在不行。 - Yasin Yörük

0
您可以使用DB门面来创建数据库,如下所示(前提是SQL用户具有此权限):
DB::statement('CREATE DATABASE myNewDB');

但我建议您重新考虑数据结构 - 为每个用户单独创建一个数据库很可能不是解决您遇到的问题的正确方案,反而可能会带来更多问题。


谢谢你的建议,我同意你的观点,这确实有点复杂。但我们必须为每个用户创建数据库。其实用户不是指个人用户,而是公司用户。所以公司有很多数据。我不能把它们都放在一个数据库中。顺便说一句,这是一个问题。我对Laravel还是个新手。我该在哪里运行这段代码?是在控制器上还是模型上? - Yasin Yörük
这取决于你自己的决定。通常情况下,你不会想在 Laravel 控制器中放置太多逻辑,因为控制器中的代码不能以一种良好的方式重复使用,但如果这个数据库创建只发生在一个地方,那么你可以这样做。否则,我建议采用面向对象的方法,在适当的实体模型中将数据库创建作为一个方法来完成,例如 $company->createDatabase()。 - Tadas Paplauskas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接