Laravel迁移 - 创建一个新的列并从现有列填充

4

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

我想使用帮助函数将名称列转换为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();
    }
}

我是个白痴吗?我能让这个工作吗?

谢谢


收到错误信息 Call to undefined method stdClass::save(),我该如何保存更改? - Ryk Waters
2个回答

9
假设你有一个“Team”模型:
$teams = App\Team::all();

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

您正在尝试在实际使用查询构建器的代码中使用Eloquent ORM语法($team->save)。 您最好选择其中之一(ORM或查询构建)。 我的版本使用Eloquent ORM。 当然,您也可以始终使用查询构建器语法,像这样:

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

基本上,查询构建器选择命令(例如$teams = DB::table('teams');)将返回stdClass对象数组(它们没有“保存”方法),而Eloquent ORM选择将返回指定模型的对象集合,这些对象具有“保存”方法。


你介意解释一下为什么你的版本能够工作而我的版本不能吗?(请在回答中说明原因)。是因为我的是结果而不是对象吗?这对我和其他可能会遇到这个问题的人都很有用! - Ryk Waters
我认为应该是 $users = DB::table('users')->get(); - Paranoid Android
谢谢您,我一直在寻找这个 Laravel 9 的更新,->update(['slug' => Str::slug($team->name)]) - anjanesh

1

您没有使用name列,而是使用(空)slug。请尝试以下更改:

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

太好了!已更改,并让我进入下一个错误(现在在注释中)。 - Ryk Waters
等一下! - Ryk Waters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接