用slug更新laravel 5型号

时间:2016-11-02 20:52:39

标签: laravel laravel-5 slug

我在'啤酒'表中创建了一个名为'slug'的行,我想存储我的啤酒名称的slu ..问题是我已经有超过1000啤酒,我不想手动输入slu to其中每一个所以我试图制作一个脚本来自动更新所有slu ..但我没有这样做:

这是我的代码,为每一个新啤酒提供一个slug

/**
   * Set the title attribute and automatically the slug
   *
   * @param string $value
   */
  public function setNameAttribute($value)
  {
      $this->attributes['name'] = $value;

      if (! $this->exists) {
          $this->setUniqueSlug($value, '');
      }
  }

/**
   * Recursive routine to set a unique slug
   *
   * @param string $title
   * @param mixed $extra
   */
  protected function setUniqueSlug($name, $extra)
  {
      $slug = str_slug($name.'-'.$extra);

      if (static::whereSlug($slug)->exists()) {
          $this->setUniqueSlug($name, $extra + 1);
          return;
      }

      $this->attributes['slug'] = $slug;
  }

代码工作正常,但如何使用唯一的slug更改数据库中的所有现有啤酒。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

在这种情况下,在我看来,最佳做法是使用命令行界面任务来处理在适当的slug中生成每个名称。在Laravel中制作命令是小菜一碟:查看文档here (creating commands)

在handle方法中,获取所有记录的集合(可能在100/200的块中,如here (chunking results)所述。将名称设置为当前值($ model-> name = $ model-&gt ; name)应该做的就是触发模型中的setter方法,该方法被指定为根据给定的名称生成slug。显然,在设置值之前,只需检查slug字段是否为空。

答案 1 :(得分:1)

你可能意味着你创建了一个名为' slug'在啤酒桌上,而不是ROW。

我会:

更改数据库定义

如果您在应用上使用迁移..也许是个主意:

使slug专栏成为一个独特的迁移。因此,当您尝试添加不是唯一的slug时,您的数据库将在未来开始发表评论。所以你的未来就是证明。

更改当前数据

用于更改当前数据。如果它只是一次性操作,为什么不使用Tinker?

$php artisan tinker;

在修补程序中,您选择所有模型(或子集)&在每一个上运行该方法。类似的东西:

$beers = Beer::all();
foreach ($beers as $beer) {
   //do your thingy
   $beer->save()
}

但是:确保您键入的代码在本地测试,并且不要在生产中使用all()(但是在较小的部分使用)...: - )