Laravel 迁移:将多个值合并到一个新列中
Laravel Migration: Combine multiple values in a new colum
我正在尝试使用 Laravel 进行迁移。这个想法是在不同的 table 中获取 'code' 和 'id' 列的值,并将它们合并到一个带有 '-' 分隔符的 'name' 列中。
所以部分是 SQL 问题。
目前我正在尝试这样的事情。
第一次迁移以创建新列'name'
public function up()
{
Schema::table('work_order', function (Blueprint $table) {
$table->string('name')->nullable();
});
}
(工作正常)
然后第二次迁移以用值填充新列
class AlterColumnNameWorkOrder extends Migration
{
public function up()
{
$company_code = DB::statement("SELECT code FROM company");
$campaign_code = DB::statement("SELECT code FROM campaign");
$work_order_number = DB::statement("SELECT id FROM work_order");
DB::statement("UPDATE work_order SET name = $company_code + '-' + $campaign_code + '-' + $work_order_number");
}
我遇到了这个错误
SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "-"
LINE 1: UPDATE work_order SET name = 1 + '-' + 1 + '-' + 1
我在想我得到的不是值而是索引。
更新:我通过将 + 替换为 || 解决了问题。但现在在 'name' 列中,我的所有值都是“1-1-1”。这些值未被表示。我错过了什么?
更新 2:我注意到我定义了一个不必要的变量 $work_order_number。由于属于同一个table 待更新。所以我把它去掉,直接把字段“id”放在语句中。
DB::statement("UPDATE work_order SET name = $company_code || '-' || $campaign_code || '-' || id");
现在第三个值显示正确。这减少了我从另一个 table 获取值到列中的问题。
首先,您不应该使用迁移来填充数据库。阅读有关种子的 documentation。
此外,我认为您的 select 查询是错误的。你是不是少了一个 where
子句?
运行 php artisan migrate
迁移您的数据库,然后创建一个新种子,并将其添加到 run
方法中:
$company_code = DB::table('company')->select('code')->where('id', some_id)->first()->code;
$campaing_code = DB::table('campaing')->select('code')->where('id', some_id)->first()->code;
$work_order_number = DB::table('work_number')->select('id')->where('id', some_id)->first()->id;
$sql = "UPDATE work_order SET name = concat('{$company_code}', '-', '{$campaign_code}', '-', '{$work_order_number}');
DB::statement(DB::raw($sql));
现在,只需 运行 php artisan db:seed --class=YourSeedClassName
就可以了。
我正在尝试使用 Laravel 进行迁移。这个想法是在不同的 table 中获取 'code' 和 'id' 列的值,并将它们合并到一个带有 '-' 分隔符的 'name' 列中。 所以部分是 SQL 问题。
目前我正在尝试这样的事情。
第一次迁移以创建新列'name'
public function up()
{
Schema::table('work_order', function (Blueprint $table) {
$table->string('name')->nullable();
});
}
(工作正常)
然后第二次迁移以用值填充新列
class AlterColumnNameWorkOrder extends Migration
{
public function up()
{
$company_code = DB::statement("SELECT code FROM company");
$campaign_code = DB::statement("SELECT code FROM campaign");
$work_order_number = DB::statement("SELECT id FROM work_order");
DB::statement("UPDATE work_order SET name = $company_code + '-' + $campaign_code + '-' + $work_order_number");
}
我遇到了这个错误
SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "-"
LINE 1: UPDATE work_order SET name = 1 + '-' + 1 + '-' + 1
我在想我得到的不是值而是索引。
更新:我通过将 + 替换为 || 解决了问题。但现在在 'name' 列中,我的所有值都是“1-1-1”。这些值未被表示。我错过了什么?
更新 2:我注意到我定义了一个不必要的变量 $work_order_number。由于属于同一个table 待更新。所以我把它去掉,直接把字段“id”放在语句中。
DB::statement("UPDATE work_order SET name = $company_code || '-' || $campaign_code || '-' || id");
现在第三个值显示正确。这减少了我从另一个 table 获取值到列中的问题。
首先,您不应该使用迁移来填充数据库。阅读有关种子的 documentation。
此外,我认为您的 select 查询是错误的。你是不是少了一个 where
子句?
运行 php artisan migrate
迁移您的数据库,然后创建一个新种子,并将其添加到 run
方法中:
$company_code = DB::table('company')->select('code')->where('id', some_id)->first()->code;
$campaing_code = DB::table('campaing')->select('code')->where('id', some_id)->first()->code;
$work_order_number = DB::table('work_number')->select('id')->where('id', some_id)->first()->id;
$sql = "UPDATE work_order SET name = concat('{$company_code}', '-', '{$campaign_code}', '-', '{$work_order_number}');
DB::statement(DB::raw($sql));
现在,只需 运行 php artisan db:seed --class=YourSeedClassName
就可以了。