【问题标题】:generate slug field for an existing data in database为数据库中的现有数据生成 slug 字段
【发布时间】:2021-09-23 08:17:17
【问题描述】:

我正在使用 laravel 和 phpmyadmin,我需要为我的数据库中的 12K 条目添加 slug 字段。

我尝试使用路由来使用 slug 数据更新空的“slug”列:

Route::get('/slug', function(){


$needSlugs = entreprise::where('slug', '')->get();

foreach($needSlugs as $slug){
    $slug->update([
        'slug' => Str::slug($slug->RS)
    ]);
}});

但是它需要很长时间,并且在 slugging 大约 400 列后返回错误,我需要重新开始,我需要几个小时才能完成,我搜索了很多,但没有找到适合我的案例的好的解决方案。

请有什么好的方法!!

PS : 我正在使用 sluggable-eloquent 包来 slugg 数据库中任何新保存的数据。

【问题讨论】:

    标签: php laravel phpmyadmin slug


    【解决方案1】:

    试试这个。

    $needSlugs = entreprise::whereNull('slug')->update(["slug"=> DB::raw("replace(trim(lower(RS)), ' ', '-')")]);
    

    注意:如果是真实数据,请保留备份以确保安全

    【讨论】:

      【解决方案2】:

      12K 行算不了什么。它通常只需要几秒钟即可完成,可能还有其他原因导致它无法完成 可能是因为网关超时或服务器上的其他限制。 尝试使用php artisan tinker 运行它,并尝试分块您的记录。

      $ php artisan tinker
      
      App\Models\entreprise::where('slug', '')->chunk(500, function($recs){
        $recs->map(function($record){
          $record->update([
            'slug' => Str::slug($record->RS)
          ]);
        });
      });
      

      【讨论】:

      • 那么块到底是做什么的!!
      • 它工作得很好,我只是想问你我是否想在现场网站上做同样的事情,因为显然这种方法只适用于本地机器!!
      • 这都是关于服务器限制的。内存或 max_execution_time。 (写错误看看哪个有问题)。您必须增加其中之一(或两者)才能在生产中运行此代码。但我不建议在生产服务器上这样做
      • 我怎样才能对我的实时数据库做同样的事情!!
      • 您必须在您的实时数据库中运行此查询,使用实时凭据编辑 .env db 配置,就是这样
      猜你喜欢
      • 2012-10-25
      • 2016-09-15
      • 2016-05-06
      • 2015-07-13
      • 2016-02-22
      • 2014-10-20
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多