使用 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()(但要分小部分使用)...:-)
我在我的“啤酒”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()(但要分小部分使用)...:-)