使用外键创建现有表的slug

时间:2017-06-02 13:15:39

标签: php mysql laravel

我有两张桌子 - 通过外键(product_id)连接的广告系列和产品

广告活动

|id| |product_id| |slug|

产品

|id| |product_name|

如何从Products表中生成slug列中的slugs。

例如,product_name = "Pro Evolution Soccer 2017"的产品有id = 1。如何在广告系列表格中生成广告Pro-evolution-soccer-2017-1?可能我应该使用Laravel辅助函数str_slug($title, $separator);,但我不知道如何......

顺便说一句,我有超过50万种产品需要生成slu ... ...

2 个答案:

答案 0 :(得分:1)

您应该在创建和更新的Products表中保存它。如果您这样做一次,在单独的表中,如果/当Products.product_name发生更改时,它将导致问题。

TypeError: can't convert expression to float

要更新现有项目,您可以创建迁移以将$product->slug = str_slug($product->product_name, '-'); 字段添加到Product,然后选择所有产品,遍历它们,并像上面一样设置slug值。

slug

然后从命令行中查看<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use App\Models\Product; class CreateFlightsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('Products', function (Blueprint $table) { $table->string('slug'); }); foreach (Product::all() as $product) { $product->slug = str_slug($product->product_name, '-'); $product->save(); } } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('Products', function (Blueprint $table) { $table->dropColumn('slug'); }); } }

答案 1 :(得分:0)

您可以创建一个命令来执行此作业documentation

并运行循环以通过命令行创建并保存所有这些slu ..

此方法也可以在将来使用,或者安排它经常运行并填充新的空行。