マイグレーションまとめ(Laravel5)

https://readouble.com/laravel/5.3/ja/migrations.html

Laravelではデフォルトでusersテーブルのマイグレーションがある。

##マイグレーションを作る

1) artisanコマンドを実行「php artisan make:migration XXXXX」
database/migrations/に、yyyy_mm_dd_hhmmss_XXXXX が作成される
2) マイグレーションファイルに、up downを記述 (カラムを追加する)
3) マイグレーション実行「$php artisan migration」

[オプション]
--createオプション　テーブルの作成 　Schema::create()
--tableオプション　 テーブルの編集 Schema::table()

https://laravel.com/docs/5.1/migrations#writing-migrations


##マイグレーションのサンプル1

```
$ php artisan make:migration create_posts_table --create=posts　
```

--createオプションでテーブル名を指定すると新規でテーブル作成。

ファイル名
2017_02_10_114629_create_posts_table.php

クラス名
class CreatePostsTable extends Migration

2017_02_10_114629_create_posts_table.php


```php

<?php

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

//マイグレーション名をキャメルケースに変換したものがクラス名になる
class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
    //オプションで渡した名前がテーブル名になる
    //--createオプション Schema::createになる
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

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

##マイグレーションのサンプル2(※外部キー制約参照)

マイグレーションとモデルを同時に作る場合

```
$ php artisan make:model Comment --migration
```

ファイル名
2017_02_13_110711_create_comments_table.php

クラス名
class CreateCommentsTable extends Migration


```php

<?php

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

//マイグレーション名をキャメルケースに変換したものがクラス名になる
class CreateCommentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            //負の値になることは無いので、unsigned()
            $table->integer('post_id')->unsigned();
　　　　　　　　　　　　　　　　　　　　　　　　//一行コメントなので string('body')
            $table->string('body');
            $table->timestamps();

　　　　　　　　　　　　　　　　　　　　　　　　//外部キー制約 postsテーブルのidと紐付け
            $table->foreign('post_id')
                  ->references('id')
                  ->on('posts')
                  ->onDelete('cascade');
        });
    }

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

##外部キー制約
https://readouble.com/laravel/5.1/ja/migrations.html

##onDelete

- CASCADE　 親テーブルに対して更新を行うと子テーブルで同じ値を持つカラムの値も合わせて更新される

- SET NULL  親テーブルに対して更新/削除を行うと子テーブルで同じ値を持つカラムの値がNULLに更新される

- RESTRICT　エラーが発生

- NO ACTION　RESTRICTと同じ


#モデル サンプル

```app/Post.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
    protected $fillable = ['title', 'body'];

    public function comments() {
      return $this->hasMany('App\Comment');
    }
}
```

```app/Comment.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    //
    protected $fillable = ['body'];

    // comment->post
    public function post() {
      return $this->belongsTo('App\Post');
    }
}
```