我在'啤酒'表中创建了一个名为'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更改数据库中的所有现有啤酒。 谢谢你的帮助。
答案 0 :(得分:1)
在这种情况下,在我看来,最佳做法是使用命令行界面任务来处理在适当的slug中生成每个名称。在Laravel中制作命令是小菜一碟:查看文档here (creating commands)
在handle方法中,获取所有记录的集合(可能在100/200的块中,如here (chunking results)所述。将名称设置为当前值($ model-> name = $ model-&gt ; name)应该做的就是触发模型中的setter方法,该方法被指定为根据给定的名称生成slug。显然,在设置值之前,只需检查slug字段是否为空。
答案 1 :(得分:1)
我会:
更改数据库定义
如果您在应用上使用迁移..也许是个主意:
使slug专栏成为一个独特的迁移。因此,当您尝试添加不是唯一的slug时,您的数据库将在未来开始发表评论。所以你的未来就是证明。
更改当前数据
用于更改当前数据。如果它只是一次性操作,为什么不使用Tinker?
$php artisan tinker;
在修补程序中,您选择所有模型(或子集)&在每一个上运行该方法。类似的东西:
$beers = Beer::all();
foreach ($beers as $beer) {
//do your thingy
$beer->save()
}
但是:确保您键入的代码在本地测试,并且不要在生产中使用all()(但是在较小的部分使用)...: - )