はじめに
既に運用しているテーブルにカラムを追加したいときありますよね。
ただ、既に存在するレコードの新規カラムに値が何も入っていない状態になってしまうことは防ぎたい。
マイグレート実行時に指定した値を、新規カラムに挿入できないだろうか。
今回は、Laravelのマイグレーション機能を利用し、既存テーブルにカラムを追加し、
さらに既に存在するレコードの新規カラムに値を挿入する方法についてまとめました。
※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。
この記事の目的
以下内容についてアウトプット
- マイグレート実行時に特定のカラムに値を挿入する
- 外部キー制約を持つカラムの場合の対応方法
この記事の内容
- NOT NULL制約を持つカラムを追加したい時
- 外部キー制約を持つカラムを追加したい時
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などの値が入ってしまい、
特定の値を登録しようとした時に、 外部キー制約違反 のエラーが出てしまいます。