如何直接在 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){
我正在使用 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){