LoginSignup
31
21

More than 5 years have passed since last update.

Laravel5のマイグレーションでの迷走

Posted at

関連URL
MAMPにLaravel5を使える環境を作ってみる
MAMPにLaravel5を使える環境を作ってみる~DB設定編~
Laravel5でFORMの作成

自分環境のブラウザアクセス
http://pj_laravel5.dev:8888/

DBへテーブル作成するために実行する migrate
最初の1回、スキーマ登録すれば終わり!って言う訳にはいきません。

  • 追加でカラムはどういれるのか?
  • テーブルが違うカラム追加の時、まとめてかけないのか?

調べている途中で database/migrations/ の中に作られたマイグレーションファイルをいじってしまったことで起きた事をメモしておきます。

<始める前の状態>

database/migrations/ 配下
$ ls
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2016_01_12_193858_create_clients_table.php

<迷走にいたるまでの道のり:作業があちこち飛びます>

  • mixファイルを作ってみる マイグレーションファイル生成コマンドでテーブル指定をしなければ内容が空のup(),down()メソッドが作られることはわかった。 ならば、そこにmixして書いちゃえばいいんじゃないか?ということでオプション付けずにファイル名もmix***とかして実行。
$ php artisan make:migration mix_tuika_to_clients_table
Created Migration: 2016_01_13_170148_mix_tuika_to_clients_table

本家サイトを参考におさらいすると、オプションを指定して実行すればSchemaが作られてる。

--create=テーブル名の場合
public function up()
{
 Schema::create('テーブル名', function (Blueprint $table) {
    $table->型('カラム名');
 });
}
public function down()
{
 Schema::drop('テーブル名');
}
--tableの場合=テーブル名の場合
public function up()
{
 Schema::table('テーブル名', function (Blueprint $table) {
    $table->型('カラム名');
 });
}
public function down()
{
 Schema::table('テーブル名', function (Blueprint $table) {
    $table->dropColumn('カラム名');
 });
}
  • この状態を確認する工程で、--tableオプションをつけてマイグレーションファイルを作成したり消したりしている。
    さらに、migrate を実行した後で、中身が何もなかったaddファイルを消したりもしている
$ php artisan make:migration add_tuika_to_clients_table
 Created Migration: 2016_01_13_170245_add_tuika_to_clients_table
$ rm database/migrations/2016_01_13_170245_add_tuika_to_clients_table.php
$ php artisan make:migration add_tuika_to_clients_table  --table=clients
 Created Migration: 2016_01_13_170400_add_tuika_to_clients_table
$ ls database/migrations/
 2014_10_12_000000_create_users_table.php
 2014_10_12_100000_create_password_resets_table.php
 2016_01_12_193858_create_clients_table.php
 2016_01_13_170148_mix_tuika_to_clients_table.php
 2016_01_13_170400_add_tuika_to_clients_table.php
$ php artisan migrate
 Migrated: 2016_01_13_170148_mix_tuika_to_clients_table
 Migrated: 2016_01_13_170400_add_tuika_to_clients_table
$ rm database/migrations/*add*
$ php artisan migrate
 Nothing to migrate.
  • addファイルを消した後で、migrate実行して「Nothing to migrate.」が出てきた。実際のテーブルも何も変わらなかったので、、createファイルも消してみた。
$ rm database/migrations/*2016_01_12_193858_create_clients_table.php
$ php artisan migrate
 Nothing to migrate.
$ cd database/migrations/
$ ls
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2016_01_13_170148_mix_tuika_to_clients_table.php
  • とりあえずおかしなことは起きなかったので、問題ないと思い、消したcreateファイルだけ同じ名前でまた作ってみた。
$ ls database/migrations/
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2016_01_12_193858_create_clients_table.php
2016_01_13_170148_mix_tuika_to_clients_table.php
  • rollbackを試してみるとエラー、refreshもエラー
$ php artisan migrate:rollback
<!!真っ赤なエラーボックスに囲まれててビックリ
  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Class 'AddTuikaToClientsTable' not found                  
<!!
$ php artisan migrate:refresh
<!!真っ赤なエラーボックスに囲まれててビックリ
  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Class 'AddTuikaToClientsTable' not found 
<!!

-これはaddファイルを消したことで起きているのではと推測、ファイルを作成してからrefreshを実行してみるがエラー、rollbackももちろんエラー

$ php artisan make:migration add_tuika_to_clients_table  --table=clients
Created Migration: 2016_01_13_173134_add_tuika_to_clients_table
$ cd database/migrations/
$ ls
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2016_01_12_193858_create_clients_table.php
2016_01_13_170149_mix_tuika_to_clients_table.php
2016_01_13_173134_add_tuika_to_clients_table.php
$ php artisan migrate:refresh
<!!真っ赤なエラーボックスに囲まれててビックリ
  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Class 'AddTuikaToClientsTable' not found 
<!! 
$ php artisan migrate:rollback
<!!真っ赤なエラーボックスに囲まれててビックリ
  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Class 'AddTuikaToClientsTable' not found                  
<!!  
  • AddTuikaToClientsTableをgrepして探してみたりもしましたが、database/migrations/の中しかひっかかりません。 どこに何が記録されているのか検討もつかないので、一度 migrateしてみることにしました。
$ php artisan migrate
<!!真っ赤なエラーボックスに囲まれててビックリ
  [Illuminate\Database\QueryException]                                                        
  SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'tuika' (SQL: alter tab  
  le `clients` add `tuika` text not null)                                                     
<!!  
<!!真っ赤なエラーボックスに囲まれててビックリ
  [PDOException]                                                              
  SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'tuika'  
<!!
  • なんてことでしょう!migrateもできなくなりました。確かに、DBにはすでにtuikaカラムが入っています。 これはいろいろな問題が重なってしまったようです。 とりあえず、rollback,refresh問題、Class 'AddTuikaToClientsTable' not foundの原因がわかりました。
$ ../../bin/composer.phar dump-autoload
Generating autoload files

composerがクラス名を握っているようです。
なので、dump-autoloadをしてあげてください。

この解決策がわかったのは、このサイトをみたからです

  • もう一度refreshに挑戦です。クラスのエラーは消えましたが別のエラーがおきました。これはDBサーバが起動していなかったせいでした。。。
$ php artisan migrate:refresh
<!!真っ赤なエラーボックスに囲まれててビックリ
  [PDOException]                                    
  SQLSTATE[HY000] [2002] No such file or directory  
<!!                                                   
  • 気を取り直して、もう一度、別のエラーがお目見えです。これはいろいろいじっていたときにmigrateをしたりして、clientsテーブルにtuika1カラムができてしまったことで起きていました。
    項目を追加した記録のマイグレーションファイルがないので、DBのほうからtuika1カラムを消します!
$ php artisan migrate:refresh
<!!真っ赤なエラーボックスに囲まれててビックリ
  [Illuminate\Database\QueryException]                                                        
  SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'tuika1' (SQL: alter ta  
  ble `clients` add `tuika1` text not null)                                                   
<!! 
<!!真っ赤なエラーボックスに囲まれててビックリ
  [PDOException]                                                               
  SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'tuika1'  
<!! 
  • うまいことrefreshできるようになりました。
$ php artisan migrate:refresh
Rolled back: 2016_01_13_170148_mix_tuika_to_clients_table
Rolled back: 2016_01_12_193858_create_clients_table
Rolled back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2016_01_12_193858_create_clients_table
Migrated: 2016_01_13_170148_mix_tuika_to_clients_table
Migrated: 2016_01_13_173134_add_tuika_to_clients_table
$ ls database/migrations/
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2016_01_12_193858_create_clients_table.php
2016_01_13_170148_mix_tuika_to_clients_table.php
2016_01_13_173134_add_tuika_to_clients_table.php

ここまでマイグレーションファイルを消したり変に追加したりしたせいで起きたことでした。。。


本題

  • 追加でカラムはどういれるのか?
    =>素直に、マイグレーションファイルを作ってmigrateすればカラムは追加されます。

  • テーブルが違うカラム追加の時、まとめてかけないのか?
    =>できます。
    まざったマイグレーションファイルを作成して実行してみてください。

2016_01_13_170148_mix_tuika_to_clients_table.php
<?php

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

class MixTuikaToClientsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('clients', function (Blueprint $table) {
            $table->text('tuika1');
        });
        Schema::create('test_table', function (Blueprint $table) {
                $table->increments('id');
         });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('clients', function (Blueprint $table) {
            $table->dropColumn('tuika1');
        });
        Schema::drop('test_table');
    }
}
31
21
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
31
21