根据用户输入在Laravel中创建新表


Creating new table in Laravel based on user input?

我正在尝试根据Laravel框架中的用户输入创建新的mysql表。

用户提交一个在控制器中处理的表单,保存表单数据,然后根据用户的输入创建一个新表(以便稍后接收数据)。

在laravel中,可以使用schema::create()创建表

Schema::create('newtablename', function($table){
    $table->increments('id')->unique(); //primary key
    $table->string('columnname');
    etc.
});

本质上,我想这样做,除了基于用户输入的表名和列名:

用户输入是一个像这样的多维数组:

    $newtableschema = array(
             'tablename' => 'tablename',
             'colnames' => array('One', 'Two', 'Three', 'Four');
          );
    Schema::create($newtableschema['tablename'], function($table){
        $table->increments('id')->unique(); //primary key        
        foreach($newtableschema['colnames'] as $col){
            $table->text($col);
        }
        etc.
    });

我得到的错误是没有定义变量。我不知道如何将用户的输入提供给schema::create方法

在我最后3个小时的谷歌搜索中,我在文档中找不到任何以这种方式创建表的方法,也找不到类似的方法。雄辩的语法有时会让我感到困惑,所以也许我错过了一些显而易见的东西。

有什么想法吗?或者有没有一种替代的纯php/sql来实现这一点?

非常感谢

编辑:很抱歉,我在示例代码的前面打错了字。我的问题是,我不知道如何将我想要的变量传递给模式::create()

您可以使用use($newtableschema)将变量传递到closure:

Schema::create($newtableschema['tablename'], function($table) use($newtableschema) {
    // So now you can access the $newtableschema variable here
    // Rest of your code...
});

首先…'$colname与"$colname"不是一回事,它应该只是没有撇号的$colname。

我不确定这是否可行。。。但你可以试试我的方法。

  $table->text('$colname'); $table->text($colname);

如果您将$variable放入单引号中,PHP会认为它是普通文本,因此字符串会按照编写时的方式显示。你应该看看这个代码:

$colname = 'something';
echo '$colname'.'<br />';
echo "$colname".'<br />';
echo "{$colname}".'<br />';
echo $colname.'<br />';

输出为:

$colname
something
something
something

所以这显然与Eloquent无关。

您使用过:

$table->text('$colname');

因此,您尝试创建一个名为$colname的文本文件,如果您想将其用作变量,在这种情况下应该简单使用:

$table->text($colname);