在飞行中创建数据库

时间:2013-12-05 05:28:56

标签: laravel laravel-4

我正在开发laravel 4应用程序,因为我想允许用户注册应用程序,当他们注册应用程序时应该允许注册用户使用新的空数据库,我使用mysql进行后端我知道以下代码设置数据库连接

Config::set('database.connections', ConnectionArray);

并将其设为默认

Config::set('database.default', ConnectionKey); 

手动连接另一个数据库我可以这样使用

'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'database', 
    'username'  => 'root',
    'password'  => '123456',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),
'mysql_tenant1' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'tenant1',  
    'username'  => 'root',
    'password'  => '123456',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

但我想应用程序应该动态创建数据库......

2 个答案:

答案 0 :(得分:3)

创建数据库本身会相对简单。复杂性在于以某种方式将这些数据库与用户相关联,然后提取这些数据库名称并在连接中使用它们。这应该有所帮助:

就整体战略而言,考虑创建一个包含一些功能的新存储库:

  1. RegisterUser() - 用户名/密码注册用户。
  2. CreateDatabase($name , $user_id) - 这应该创造你的 数据库并将其名称存储在表中,然后将其分配给您在“注册用户”中创建的用户ID。
  3. 您可以使用DB::statement()在Laravel中运行原始SQL查询(即 - ``DB :: statement('create database'。$ name);`,所以将它粘贴在您的CreateDatabase函数中。我在本地测试了这个它运作得很好。

    注意:您需要进行一些验证以确保数据库尚不存在,或者您的用户(显然)会收到错误。

    然后,您可以按用户ID从表中提取数据库名称,并按照下面的SO所述创建与它的连接!

    Laravel 4: Multiple Tenant Application, each tenant it's own database and one global database

    有一件事 - 当您对数据库结构进行更改时,您将不得不单独更新每个数据库。请注意,Artisan允许使用--database="database_name"选项。

答案 1 :(得分:0)

在任何表格中都有一个user_id字段(我认为您正在描述的数据库),并使用关系使其工作,一个表中的一大堆字段(或多个表)可能比你想象的更有效率。