我有一个博客网站。我更改了品牌名称。因此,我需要更改所有包含我的品牌名称的博客文章。
我可以找到它们,就像:
$search = 'old-brand-name';
$posts = \App\Models\BlogPost::where('description', 'LIKE', '%'.$search.'%')->get();
但是我必须用新的品牌名称替换数据库级别的这些字符串。我该怎么办?
答案 0 :(得分:2)
您应该迭代每个帖子,然后通过将old_brand_name替换为new_brand_name来更改描述,并更新此帖子。
foreach($posts as $post){
$old_des = $post->description;
$post->description = str_replace($search,'new-brand-name', $post->description);
$post->save();
}
希望它可以为您提供帮助
答案 1 :(得分:1)
我知道这可能是一个老问题,但你也可以这样做
\App\Models\BlogPost::where('description', 'LIKE', '%'.$search.'%')
->update([
$column => DB::raw("REPLACE($column,'$search','$replace')")
]);
答案 2 :(得分:0)
$search = 'old-brand-name';
$posts = \App\Models\BlogPost::where('description', $search)->update('description', $newName);
仅当“描述”列的内容恰好是您的品牌名称时,此方法才有效,否则,您必须在描述列中提供有关内容的更多具体信息。
答案 3 :(得分:0)
如果您需要更新所有帖子并获得所有结果:
$old = 'old-brand-name';
$new = 'new-brand-name';
$posts = \App\Models\BlogPost::where('description', 'LIKE', '%' . $search . '%')
->get()
->map(function ($item) use ($old, $new) {
$item->description = str_replace($old, $new, $item->description);
$item->save();
return $item;
});
// Print all
dd($posts->toArray());
答案 4 :(得分:0)
您可以使用Mysql Replace,它将所有出现的char替换为一个表列:
update posts set description = REPLACE(description,'old','new');
效率更高,因为您不必查询所有出现的结果来替换字符。
Segundo,使用集合回调而不是foreach,它更具可读性和性能友好。 (如地图,缩小等)。
答案 5 :(得分:0)
您可以使用Query Builder在单个事务中查找/替换字符串值。
$oldBrandName = 'Acme Co';
$newBrandName = 'Bar Co';
DB::update(
'update blog_posts set description = replace(description, ?, ?)',
[
$oldBrandName,
$newBrandName
]
);