Laravel-如何替换数据库中的字符串

时间:2018-08-24 08:17:23

标签: php mysql laravel laravel-5

我有一个博客网站。我更改了品牌名称。因此,我需要更改所有包含我的品牌名称的博客文章。

我可以找到它们,就像:

$search = 'old-brand-name';
$posts = \App\Models\BlogPost::where('description', 'LIKE', '%'.$search.'%')->get();

但是我必须用新的品牌名称替换数据库级别的这些字符串。我该怎么办?

6 个答案:

答案 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
  ]
);