schedule2019-12-26

【Laravel】migrateでテーブルが存在したらスキップする

SQLで作成したり元から存在するテーブルにも今後のためにmigrateファイルを作っておく。 単純に作るとSQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists ...とマイグレートできないため、既にテーブルがあればスキップするようにマイグレーションファイルを修正する。

// 2015_12_12_000000_create_users_table.php
<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        if (Schema::hasTable('users')) {
            // テーブルが存在していればリターン
            return;
        }
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

if (Schema::hasTable('users'))でテーブルが存在するか判定できる。 カラムが存在するかはif (Schema::hasColumn('users', 'email')) でOK。 存在したらリターンする。

これで、マイグレーションをエラーなく実行できる。

参考