0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】既存テーブルにカラムを追加する && 既に存在するレコードの新規カラムに値を挿入する

Posted at

はじめに

既に運用しているテーブルにカラムを追加したいときありますよね。
ただ、既に存在するレコードの新規カラムに値が何も入っていない状態になってしまうことは防ぎたい。
マイグレート実行時に指定した値を、新規カラムに挿入できないだろうか。

今回は、Laravelのマイグレーション機能を利用し、既存テーブルにカラムを追加し、
さらに既に存在するレコードの新規カラムに値を挿入する方法についてまとめました。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

この記事の目的

以下内容についてアウトプット

  • マイグレート実行時に特定のカラムに値を挿入する
  • 外部キー制約を持つカラムの場合の対応方法

この記事の内容

  1. NOT NULL制約を持つカラムを追加したい時
  2. 外部キー制約を持つカラムを追加したい時

1. NOT NULL制約を持つカラムを追加したい時

前提:

  • 既存テーブル items に、NOT NULL制約を持つカラム is_sold_out を追加したい
    • 完売かどうか判定するカラム
    • 0:在庫有り(デフォルト値)
    • 1:完売済み
  • 追加した新規カラムに特定の値 デフォルト値 を代入したい

方法:

  • マイグレーションファイルを用意する
// 構文
php artisan make:migration 任意のマイグレーション名 --table=テーブル名

// 例
php artisan make:migration add_items_table_1column  --table=items
  • マイグレーションファイルを編集する
// 省略

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // ① カラムを追加
        Schema::table('items', function (Blueprint $table) {
            $table->number('is_sold_out')->after('name'); // nameカラムの後ろに追加
        });

        // ② is_sold_outに値を登録
        Item::all()->each(function (Item $item) {
            $item->is_sold_out = 0; // デフォルト値をセット
            $ticket->save(); 
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('items', function (Blueprint $table) {
            $table->dropColumn('is_sold_out');
        });
    }
};
  • マイグレートを実行する
php artisan migrate

カラムを作成後、 items テーブルのすべてのレコードを取得し、is_sold_out に値をセットし保存します。

2. 外部キー制約を持つカラムを追加したい時

前提:

  • 既存テーブル items に、外部キー制約を持つカラム creator_id を追加したい
    • 商品登録者を表すカラム
    • users テーブルの id を外部キーとして登録する
  • 追加した新規カラムに特定の値 ユーザーID を代入したい

方法:

  • マイグレーションファイルを用意する
// 構文
php artisan make:migration 任意のマイグレーション名 --table=テーブル名

// 例
php artisan make:migration add_items_table_1column  --table=items
  • マイグレーションファイルを編集する
// 省略

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // ① カラムを追加
        Schema::table('items', function (Blueprint $table) {
            $table->unsignedBigInteger('creator_id')->after('name');
        });

        // ② creator_idに値を登録
        Item::all()->each(function (Item $item) {
            $item->creator_id = 1;
            $item->save();
        });

        // ③ creator_idに外部キー制約を付与
        Schema::table('items', function (Blueprint $table) {
            $table->foreign('creator_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('items', function (Blueprint $table) {
            $table->dropColumn('creator_id');
        });
    }
};
  • マイグレートを実行する
php artisan migrate

カラムを作成後、 items テーブルのすべてのレコードを取得し、creator_id に値をセットし保存します。
値の登録後、外部キー制約を付与 することがポイントです。

カラム作成時に外部キー制約を付けてしまうと、カラムに0やnullなどの値が入ってしまい、
特定の値を登録しようとした時に、 外部キー制約違反 のエラーが出てしまいます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?