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

disho6za  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(436)

我有一个博客网站。我改了我的商标名。所以我需要改变所有的博客文章,包括我的品牌名称。
我能找到他们,就像:

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

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

bgibtngc

bgibtngc1#

$search = 'old-brand-name';
$posts = \App\Models\BlogPost::where('description', $search)->update('description', $newName);

只有当“描述”栏的内容与您的品牌名称完全一致时,这才有效,否则您必须在“描述”栏中提供有关内容的更具体信息。

mftmpeh8

mftmpeh82#

您可以使用查询生成器在单个事务中查找/替换字符串值。

$oldBrandName = 'Acme Co';
$newBrandName = 'Bar Co';

DB::update(
  'update blog_posts set description = replace(description, ?, ?)',
  [
     $oldBrandName,
     $newBrandName
  ]
);
ego6inou

ego6inou3#

你应该迭代每一篇文章,然后用新的品牌名称替换旧的品牌名称来更改描述,并更新这篇文章。

foreach($posts as $post){
    $old_des = $post->description;
    $post->description = str_replace($search,'new-brand-name', $post->description);
    $post->save();
}

希望能对你有所帮助

ki1q1bka

ki1q1bka4#

如果您需要更新所有帖子并获得所有结果:

$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());
cvxl0en2

cvxl0en25#

您可以使用mysql replace,它将所有出现的字符替换为一个表列: update posts set description = REPLACE(description,'old','new'); 它更有效,因为您不必查询所有出现的结果来替换字符。
segundo,使用集合回调而不是foreach,它更具可读性和性能友好性(如Map、缩小等)

相关问题