【问题标题】:Laravel Migration - Create a new column filled from existing columnLaravel 迁移 - 创建一个从现有列填充的新列
【发布时间】:2015-12-25 11:32:44
【问题描述】:

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

我想将 name 列转换为 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() 如何保存更改?

标签: php mysql database laravel migration


【解决方案1】:

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

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

【讨论】:

  • 好点!改变了,让我进入下一个错误(现在在 cmets 中)
  • ;) - 抓住你的马!
【解决方案2】:

假设你有一个Team 模型:

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

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

您正在尝试在实际使用 Query Builder 的代码中使用 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)]);
}

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

【讨论】:

  • 您介意解释为什么您的版本与我的版本相反(将其放在您的答案中)。是因为我的只是一个结果,而不是一个对象吗?对我和其他可能偶然发现这个答案的人有用!
  • 我觉得应该是$users = DB::table('users')->get();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多