使用 slug 更新 laravel 5 个模型

Update laravel 5 models with slug

我在我的“啤酒”table 中创建了一行名为“slug”的行,我想在其中存储我的名字的 slug beers.the 问题是我已经有超过 1000 瓶啤酒而且我不想手动将 slug 输入到每个 slug,所以我试图制作一个脚本来自动更新所有 slug。但我没能做到:

这是我的代码,用于为每瓶新啤酒提供一个 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 更改数据库中所有现有的啤酒。 感谢您的帮助。

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

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

顺便说一句,您的意思可能是您在啤酒 table 中创建了一个名为 'slug' 的列,而不是行。

我会:

更改数据库定义

如果您在您的应用程序上使用迁移..也许是一个想法:

使 slug 列在迁移中是唯一的。因此,当您尝试添加一个不是唯一的 slug 时,您的数据库将在未来开始发表评论。所以你在这方面是面向未来的。

正在更改当前数据

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

$php artisan tinker;

在 tinker 中,您 select 所有模型(或子集)和 运行 每个模型的方法。类似于:

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

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