如何直接在 Controller 中为 运行 新迁移使用变量而不是列名

How to use variables instead of column names for running new Migrations directly in the Controller

我正在使用 Laravel 8 并且我想 运行 插入两个新列的代码,如果 product_attr_info_correction 列名称的返回结果中不存在属性名称.

    $allAttrs = Attribute::all();
    $columns = Schema::getColumnListing('product_attr_info_correction'); 

    for($i=0;$i<count($allAttrs);$i++){
        foreach($columns as $column){
            if(!empty($allAttrs[$i]->name)){
                if(str_contains($column,$allAttrs[$i]->name)){
                    continue;
                }else{
                    $columnName = "product_".$allAttrs[$i]->name."_attr_correction";
                    $columnName2 = "product_".$allAttrs[$i]->name."_attr_rejecting_reason";
                    
                    Schema::table('product_attr_info_correction', function($table)
                    {
                        global $columnName;
                        global $columnName2;
                        
                        $table->tinyInteger($columnName)->default(1)->comment('confirmed = 1 , not confirmed = 0')->after('product_id');
                        $table->string($columnName2)->nullable()->after($columnName);
                    });
                    dd(1);
                }
            }else{
                continue;
            }
        }
    } 

除了数据库列创建部分 returns 这个错误:

SQLSTATE[42000]: 语法错误或访问冲突: 1166 列名不正确 '' (SQL: alter table product_attr_info_correction添加 tinyint not null default '1' comment 'confirmed = 1 , not confirmed = 0' after `product_id`, add varchar(255) null)

但是,如果我将 $table->tinyInteger($columnName)->... 替换为 $table->tinyInteger('column_name_example')->...,它会正常工作并创建一个新列。

这意味着这里无法调用变量$columnName & $columnName2

因此,如果您能告诉我当我们想直接在 Controller 中插入一个新变量时如何调用变量而不是特定名称作为列名,我将不胜感激?

global $columnName;
global $columnName2;

以上行将不起作用,因为它们是全局可用且不驻留在命名空间内的那些变量。上面的行使 PHP 检查全局命名空间内部,但没有找到任何类似的东西。因此,您遇到了 SQL 错误,其中注入变量的值变为空白或 NULL。

要解决此问题,您可以使用 use 关键字在该函数回调本身中注入这些变量,如下所示:

function($table) use($columnName, $columnName2){