Laravel Migration - 创建从现有列填充的新列

时间:2015-09-28 09:12:34

标签: php mysql database laravel migration

我正在尝试创建一个迁移,创建一个新列并使用现有列中的数据填充它。

我想将名称列转换为slug(使用辅助函数)并将其保存在slug列中。

我试过这个但没有运气:

public function up()
{
    Schema::table('teams', function(Blueprint $table)
    {
        //
        $table->string('slug', 100);
    });

    $teams = DB::table('teams')->get();

    foreach ($teams as $team)
    {
        $team->slug = str_slug($team->name, "-");
        $team->save();
    }
}

我是个白痴吗?我可以做这个工作吗?

由于

2 个答案:

答案 0 :(得分:6)

假设您有Team型号:

$teams = App\Team::all();

foreach($teams as $team) {
    $team->slug =  str_slug($team->name, "-");
    $team->save();
}

您尝试在实际使用查询生成器的代码中使用Eloquent ORM语法($team->save)。您最好选择其中一个(ORM或查询构建)。我的版本使用了Eloquent ORM。当然,您可以一直使用Query Builder语法,如下所示:

$teams = DB::table('teams');
foreach($teams as $team) {
    DB::table('teams')
            ->where('id', $team->id)
            ->update(['slug' => str_slug($team->name)]);
}

基本上,Query Builder选择命令(如$teams = DB::table('teams');)将返回一个stdClass对象数组(没有“save”方法),而Eloquent ORM select将返回指定模型的对象集合,它有“保存”方法。

答案 1 :(得分:1)

您没有使用name列,而是(空)slug。试试这个:

$team->slug = str_slug($team->name, "-");