【问题标题】:Laravel - How to replace a string in databaseLaravel - 如何替换数据库中的字符串
【发布时间】:2018-08-24 08:17:22
【问题描述】:

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

我可以像这样找到它们:

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

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

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案1】:

    您可以使用Query Builder 在单个事务中查找/替换字符串值。

    $oldBrandName = 'Acme Co';
    $newBrandName = 'Bar Co';
    
    DB::update(
      'update blog_posts set description = replace(description, ?, ?) where description like ?',
      [
         $oldBrandName,
         $newBrandName,
         $search
      ]
    );
    

    【讨论】:

    • 变量$search在哪里定义/它是什么?
    • @crazy-coders 在他们的问题中定义了一个$search 变量。实际上$search 会被替换为请求参数或函数参数等。
    【解决方案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();
    }
    

    希望对你有帮助

    【讨论】:

    • 应该是foreach()
    • 你为什么要选择 - 无论如何都要更新整个东西
    • @Insax 根据他在表达式中的 Where 子句,我认为描述包含字符串 'old-brand-name` 但不完全相等。因此,我们应该替换描述中的所有old-brand-name并更新它
    • @DuyHuynh 是的,你完全正确,我忽略了这一点。
    • 使用查询生成器完成这样的更新更快。见this answer
    【解决方案3】:

    你可以使用Mysql Replace,它将所有出现的字符替换成一个表列:

    update posts set description = REPLACE(description,'old','new');

    效率更高,因为您不必查询所有出现的结果来替换字符。

    Segundo,使用集合回调而不是 foreach,它更具可读性和性能友好。 (如 map、reduce 等)

    【讨论】:

      【解决方案4】:

      我知道这可能是一个老问题,但你也可以这样做

      \App\Models\BlogPost::where('description', 'LIKE', '%'.$search.'%')
         ->update([
            $column => DB::raw("REPLACE($column,'$search','$replace')") 
          ]);
      

      【讨论】:

      • 使用 regexp_replace($column,'$search','$replace','i');不区分大小写
      • 如果字段不是文本/字符串,您可能需要替换($column::text,....)
      【解决方案5】:
      $search = 'old-brand-name';
      $posts = \App\Models\BlogPost::where('description', $search)->update('description', $newName);
      

      这仅适用于您的“描述”列的内容正是您的品牌名称,否则您必须在描述列中提供有关内容的更具体信息。

      【讨论】:

      • 是的,这不是问题。如果我可以用我的新品牌名称替换这些字符串就可以了
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        相关资源
        最近更新 更多