Laravel5 チュートリアル ブログもどきを作る(1) DB設定・マイグレーション

## はじめに
Laravel のチュートリアルはまだまだ少なく、Qiita にもほとんど無いようなので、今回は Laravel でブログもどきを作るチュートリアルを Qiita に載せていきたいと思います。

1つの記事が長いと、読む方も萎えてしまうので、短く区切り、説明はできるだけコードの中にコメントとして書いていきます。
このチュートリアルでは、Laravel の基本的な機能・使い方しか紹介しませんので、詳細は[日本語ドキュメント](https://readouble.com/laravel/5.5/ja/)を読んで、理解を深めて頂くのが良いと思います。

また、記事中に使われているプログラムソースは [github](https://github.com/yumgoo17/like_blog) に push してありますので、よろしければご利用ください。



## 想定する読者
この記事は下記の方に読んで頂くことを想定しています。

* PHPを自由に使いこなせる方
* 他のフレームワークを使ったことがある方
* Laravel を使ってみたいなぁと思っている方



## 環境
今回は vagrant で下記の環境を構築しました。

* Laravel 5.5
* CentOS 6.5
* MySQL 5.6
* Apache 2.2
* PHP 7.1



## 前提
Laravel が動作する環境を構築し、Welcome ページが表示されるところまで設定できているものとします（Laravel 実行環境の準備についても書いて欲しい、という要望があれば別途書きたいと思います）。

Laravel をインストールすると、インストールディレクトリにプロジェクト名と同名のディレクトリが作成されます（例：`blog` というプロジェクト名なら `blog` というディレクトリ）。
作成されたディレクトリに移動すると、`app` ディレクトリや、`artisan` というファイルがあります。以下、便宜的にこのディレクトリを、Laravel ホームディレクトリと呼ぶことにします。途中に出てくるファイルパスは、特に断りの無い限り、Laravel ホームディレクトリからの相対パスです。



## データベースの初期設定
それでは、まずはデータベースの設定からやっていきましょう。

### データベースの作成
データベースは、MySQL クライアント等で、普通にSQLコマンドを実行して作成します。
今回は blog という名前のデータベースを作成します。

```
CREATE DATABASE blog DEFAULT CHARACTER SET utf8
```


### データベースの接続設定
Laravel が、今作成した blog データベースに接続するための設定をします。
Laravel ホームディレクトリにある `.env`ファイルの下記の部分を編集します。
もし、`.env`ファイルが無ければ、`.env.example`ファイルをリネームして作成してください。

```/.env
DB_CONNECTION=mysql
DB_HOST={接続ホスト名 or IPアドレス}
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME={接続ユーザー名}
DB_PASSWORD={設定したパスワード}
```



## テーブル作成
続いて、記事を保存するためのテーブルを作成します。


### テーブルスキーマ
ブログ記事を保存する articles テーブルを、下記のようなスキーマで作成したいと思います。

| 物理名     	| 論理名   	| 型               	| NOT NULL 	| デフォルト 	| 備考               	|
|------------	|----------	|------------------	|----------	|------------	|--------------------	|
| article_id 	| 記事ID   	| int(10) unsigned 	| YES       	|       	| auto_increment, PK 	|
| post_date  	| 投稿日   	| date             	| YES       	|       	|                    	|
| title      	| タイトル 	| varchar(255)     	| YES       	|       	|                    	|
| body       	| 本文     	| text             	| YES       	|       	|                    	|
| deleted_at 	| 削除日時 	| timestamp        	| NO      	| NULL       	| 論理削除用カラム   	|
| created_at 	| 作成日時 	| timestamp        	| NO      	| NULL       	|                    	|
| updated_at 	| 更新日時 	| timestamp        	| NO      	| NULL       	|                    	|


### マイグレーションファイルの作成
articles テーブルは Laravel のマイグレーションという機能を使って作成することにします。
Laravel ホームディレクトリに移動して、下記のコマンドを実行します。

```
php artisan make:model Article --migration
```

この artisan（アルチザン）というのは、アプリケーション開発において、様々な機能を提供してくれるコマンドです。
今回のように、マイグレーションファイルを作成したり、コントローラークラスを作成したりと様々な機能があります。artisan コマンドを実行するときは、Laravel ホームディレクトリに移動して実行します。artisan については追って紹介していきます。
上記コマンドは、Aritcle モデルクラスを作成すると同時に、マイグレーションファイルも作成するコマンドです。

上記のコマンドを実行すると、`database/migrations/{$timestamp}_create_articles_table.php` というファイルができていると思うので、それを開き、下記のように編集します。

```database/migrations/{$timestamp}_create_articles_table.php
class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // Schema::create() の第一引数がテーブル名、第二引数はクロージャーで、中に作成するカラム情報を書いていく
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('article_id');   // auto increment の unsigned INTカラム
            $table->date('post_date');          // DATEカラム
            $table->string('title');            // VARCHARカラム
            $table->text('body');               // TEXTカラム
            $table->softDeletes();              // ソフトデリート（論理削除）用の deleted_at カラム（TIMESTAMP型）
            $table->timestamps();               // created_at と update_at（TIMESTAMP型）カラムの両方を作成
        });
    }

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

up メソッドは、新規テーブル・カラム追加などをするときに実行され、down メソッドは up メソッドの操作を元に戻します。
カラム情報を設定するのに利用する Blueprint クラスのどのメソッドが、どのカラム型に対応しているかは、[ドキュメント](https://readouble.com/laravel/5.5/ja/migrations.html)を参照してください。もちろん、NULL許可の設定や、デフォルト値の設定、インデックスの追加なども可能です。


### マイグレーション実行
マイグレーションファイルができたら、Laravel ホームディレクトリに移動し、下記 artisan コマンドでマイグレーションを実行します。

```
php artisan migrate
```

実行できたら、実際に articles テーブルが意図通りにできたか確認しましょう。もし、意図した通りにテーブルができていなかったら、最後のマイグレーション操作について、下記コマンドでロールバックできます。

```
php artisan rollback
```

ちなみに、このマイグレーション情報（履歴）は、同じDBの migrations テーブルに格納されていくようなので、興味があれば覗いてみるのも良いでしょう。

[次回は、ブログ記事を投稿するフォームを作っていきます。](https://qiita.com/yumgoo17/items/55152da02372dd203bcb)

## 参考リンク
### Laravel 日本語ドキュメント
* [設定](https://readouble.com/laravel/5.5/ja/configuration.html#environment-configuration)
* [マイグレーション](https://readouble.com/laravel/5.5/ja/migrations.html)

### プログラムソース（github）
* [github yumgoo17/like_blog](https://github.com/yumgoo17/like_blog)