【问题标题】:How do I add default value as same from another column in Laravel Migration如何在 Laravel 迁移中添加与另一列相同的默认值
【发布时间】:2019-03-27 18:00:32
【问题描述】:

我的数据库中有一个questions 表,其中有一列question_title,现在我添加了一个列question_slug,其中将包含问题的slug URL,那么我如何在 Laravel 迁移中将question_slug 默认值设置为question_title,我需要这一切,因为我在数据库中保存了问题,所以我运行了php artisan make:migration add_column_to_questions --table=questions,现在我有了这个代码:

Schema::table('questions', function (Blueprint $table) {
    $table->string('question_slug')->default();
});

【问题讨论】:

  • 您首先需要它是唯一的,其次,您必须编写一个脚本来使用 question_text 和一些时间戳生成唯一的 url。但是由于您已经在数据库中保存了一些问题,您可以将question_slug 添加为最初可以为空的文本并运行您的脚本以基于question_title 生成并保存question_slug,然后创建另一个迁移以更新question_slug 是唯一的。
  • 您想将所有现有的question_title添加到question_slug,还是在创建新的question_title时将slug的默认值作为它?
  • @Thamerbelfkih 不,不,如果有任何方法可以获取问题的标题,那么我将应用此 strtoslug() 将其转换为 slug,然后将其保存到变量中,然后将其分配给 @987654334 @...
  • 你的 strtoslug 是类还是函数?
  • strtoslug 是 laravel 的内置函数

标签: php laravel


【解决方案1】:

首先,创建一个新的迁移并将这段代码放入其中:

connections_string : 它在 web/config/database.php 文件中 配置

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class NameOfUrMigration extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('questions', function (Blueprint $table) {
            $table->string('question_slug')->default();
        });

         $questions = DB::connection('connections_string')->table('questions')->get();

         foreach($questions as $question)
         {
            $question->question_slug = str_slug($question->question_title);
            $question->save();
         }


    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}

【讨论】:

    【解决方案2】:

    根据documentationdefault() 用于Declare a default value for a column。 这意味着如果您没有在 insert 查询中为其提供值,则默认情况下会在字段中插入该值。

    default() 无法帮助您实现您所需要的。 您可以做的是在 up() 方法中使用原始查询创建一个新的迁移类,该方法将使用 question_title 的值更新 question_slug 的值。

    类似这样的:

    public function up()
    {
        $sql = "UPDATE `questions` SET `question_slug` = `question_title` WHERE 1;"; 
        //add filtering conditions if you don't want ALL records updated
        DB::connection()->getPdo()->exec($sql);
    }
    

    确保您还为 rollback 创建了相应的 down() 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-08
      • 2021-11-10
      • 2016-10-06
      • 2019-12-31
      • 2011-10-29
      • 2016-08-28
      • 2018-06-28
      • 2015-08-12
      相关资源
      最近更新 更多