MAMPにLaravel5を使える環境を作ってみる~DB設定編~

LarvalはMySQL、PostgreSQL、SQLiteなどに対応しているそうです。
今回はMAMPにあるMYSQLを使用するとした場合の仕方を記録しておく。
　->PostgreSqlも使えるとのこと。その設定はやってみてそのうち追記
　　PostgreSQLの環境をまずは作ってから。
　　[Mac+mamp+postgresqlの環境つくり](http://qiita.com/tagosaku324/items/482dfb2ab114a5f19ff4)

随時更新かけている記事です。

関連ファイル：
[MAMPにLaravel5を使える環境を作ってみる](http://qiita.com/tagosaku324/items/0c51a400e0402b6ca2ad)

手順としては
>
1. MAMP上のMYSQLにDBを作成
　->DB名：pj_laravel5　として作成することにする
2. envファイルの変更
3. database.phpの変更  
　　<-(追記：envファイル設定していれば変更しなくてもいいみたいです。)
4. テーブルを定義する

#1. MAMP上のMYSQLにDBを作成
MAMPでデータベースを作る為、[phpmyadmin](http://localhost:8888/MAMP/index.php?page=phpmyadmin&language=Japanese)にアクセス。
データーベスタブをクリック、「データベースを作成する」から新規にpj_laravel5というDB名を作成しました。

#2. envファイルの変更

```title:.envの5〜8行目あたり変更
//下記4つをMAMPの設定にする
DB_HOST=localhost
DB_DATABASE=pj_laravel5
DB_USERNAME=root
DB_PASSWORD=root
```
MAMPのDB_USERNAMEをroot以外に設定していれば root以外にしたほうがいいです。

(追記)
gitなどからLaravelソースをローカルに持ってきた場合にはまることがあります。
>
1. key設定
2. vendorフォルダがない

サーバ管理者によっては.envファイルにkey設定されたものやvendorフォルダを用意して流場合もありますが、基本、バージョン管理には含めないものです。
vendorフォルダがない場合は、ローカル環境でインストールしましょう。

```:vendorがなかったり、環境が壊れているみたいならば
$ ~/bin/composer.phar install　＜ー私の環境ではcomposer.pharは~/bin/下にある
```
また、envファイルのAPP_KEY=＊＊＊がランダムな文字になっていない場合、自分でkeyを生成しないといけません。
参考に：[こちらを参照](http://blue-goheimochi.hatenablog.com/entry/2015/10/05/Laravel5.1%E3%81%A7No_supported_encrypter_found._The_cipher_and_/_or_key_length_are_invalid.%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E4%BB%B6)

```:.envのAPP_KEYを生成させるため
$ php artisan key:generate
```

#3. database.phpの変更
```title:config/database.phpの58〜60行目変更
 55         'mysql' => [
 56             'driver'    => 'mysql',
 57             'host'      => env('DB_HOST', 'localhost'),
 58             'database'  => env('DB_DATABASE', 'pj_laravel5'),
 59             'username'  => env('DB_USERNAME', 'root'),
 60             'password'  => env('DB_PASSWORD', 'root'),
 61 //MAMPのUnixSocketを追記
 62             'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
 63             'charset'   => 'utf8',
 64             'collation' => 'utf8_unicode_ci',
 65             'prefix'    => '',
 66             'strict'    => false,
 67         ],
```

#4. テーブルを定義する
phpMyAdminからの追加ではなく、artisanコマンドでテーブルのスキーマ定義を行ってみます。
マイグレーションって、聞き慣れなかったのですが、
DBスキーマ情報のファイルを作成（＜ーこれをマイグレーションファイルっていってる）して、ファイルを使ってDBテーブルを作ることと認識しました。
参考：[Laravelの環境設定＆開発体験自作Laravel5.1ミニマムチュートリアルまとめ](http://qiita.com/fumiyasac@github/items/78a335880f7abb1de8bf#4-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%AE%9A%E7%BE%A9)

以下の流れでテーブルを作ります。
>
1.マイグレーションファイル作成：[参考](https://laravel10.wordpress.com/2015/02/26/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-8-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90/)
　＝＞artisan make:migration コマンドで作成
2. マイグレーションファイルにDBスキーマ構成を記載
3. マイグレーション実行してテーブルを作成
4. マイグレーションでテーブル内容を変更（カラム追加）

今回は顧客情報テーブルを作ることにします。

##1.マイグレーションファイル作成
マイグレーションファイルは database/migrations フォルダに作成される。
ファイル名にタイムスタンプが付与されることで、実行順が分かる仕組みのようです。
マイグレーション名のルールは、**create_[テーブル名の複数形]_table** としてるみたいです。

テーブルの作成が行いたい場合、make:maigrationに –create オプションを指定してマイグレーションを作成します。
–createオプションには作成したテーブル名を指定します。
オプションを指定することでup(), down()メソッドにスキーマービルダーの記述は入った状態でファイルを生成してくれますが、指定しないと中身が未定義の up(), down()メソッドができてしまいます。

今回テーブル名をclientsにします。
マイグレーションファイル作成の実行するとMigrationクラスを継承した、CreateClientsTableクラスが作成されます。

```:テーブル名をclientsにする
$ php artisan make:migration create_clients_table --create=clients
Created Migration: 2016_01_12_193858_create_clients_table
```
```:database/migrations/2016_01_12_193858_create_clients_table.php
<?php

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

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

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

##2. マイグレーションファイルにDBスキーマ構成を記載
カラムはID,顧客名,備考　ぐらいにしておきます。
--createオプションをつけて実行したので、IDはすでに付いている状態です。
型宣言とか細かい説明は
[本家サイト](https://laravel.com/docs/5.1/migrations#writing-migrations)
[本家サイトを日本語訳してくれているサイト：マイグレーション説明](http://readouble.com/laravel/5/1/ja/migrations.html)
を参考に。

```:database/migrations/2016_01_12_193858_create_clients_table.php
 13     public function up()
 14     {
 15         Schema::create('clients', function (Blueprint $table) {
 16             $table->increments('id');
 17             $table->string('name'); //追加
 18             $table->text('biko'); //追加 
 19             $table->timestamps();
 20         });
 21     }
```
##3. マイグレーション実行してテーブルを作成
MYSQLにテーブルを反映させます。

```
$ php artisan migrate
Migrated: 2016_01_12_193858_create_clients_table
```
すでにtableが入っていても追加した分だけが実行されるようです。

##4. マイグレーションでテーブル内容を変更（カラム追加）
項目追加用のマイグレーションファイルを作成して、マイグレーションを実行します。
ロールバックして、「2016_01_12_193858_create_clients_table」に追加してからmigrateするとか方法はあるようですが、データが入った状態では一度登録しているものをコロコロ変えることはないでしょう。

ロールバックは実行したマイグレーションファイルのひとつ前に戻るだけなので、同じ日に複数のマイグレーションファイルを実行した場合、実行した日の前に戻したいとかなると、ファイルをどこまで戻すのやら。。みたいなことになります。
ロールバックは間違った時くらいですかね。。
ファイルの中のdown()実行がロールバックで実行されるものです。

マイグレーションファイルは履歴と同じなので、積み重なっていくもののようです。
消しちゃったり、コピーしちゃったりするとえらい目にあいます。
[Laravel5のマイグレーションでの迷走]()

テーブルの変更を行うファイルを作成するには make:migrationに –table オプションを付けます。

```
php artisan make:migration add_tuika_to_clients_table --table=clients
```
最初の、create_*** , add_*** はそう書くというルールみたいです。
**add_[カラム名]_to_[テーブル名の複数形]_table**　ッて感じがいいみたいですね。
オプションに
**[--create=テーブル名]**とすればテーブル作成用のテンプレートが
**[--table=テーブル名]**とすればテーブルを指定したテンプレートが用意されるだけみたいです。

ルールにとらわれず、マイグレーション名は自分がわかるように付けておくとよいみたいです。

```:--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('カラム名');
 });
}
```

マイグレーションについてはいろいろ悩まされています。
[Laravel5のマイグレーションでの迷走](http://qiita.com/tagosaku324/items/1c62590ead68fbf5ea3f)

-----
ちなみに、migrationでエラーが発生した時にお世話になったのがこちらのサイト
[Laravelでのmigrationでエラーが起きる](http://qiita.com/yanagikouta/items/dcd7ce16b7fb7353e086)
同じようなエラーで悩んでる方に。。

```
$ php artisan migrate
<!!真っ赤なエラーボックスに囲まれててビックリ
  [PDOException]                                    
  SQLSTATE[HY000] [2002] No such file or directory
<!!
$ php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
```
-----

##5.データを読み込む
初期値データを読み込むことができます。
参考：
[マイグレーションと初期値設定](http://readouble.com/laravel/5/0/dev/ja/migrations.html)
[初めてのLARAVEL 5.1 : (13) SEEDING](https://laravel10.wordpress.com/2015/03/05/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-13-seeding/)

モデル、app/Models/Admin.php を作成しておかないといけないようです。
[初めてのLARAVEL 5.1 : (9) モデルの作成](https://laravel10.wordpress.com/2015/02/28/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-9-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90/)
（追記：migrateを実行すれば、自動で空のクラスはできるようです。）

###5.1.初期値データの作成
```:database/seeds/DatabaseSeeder.phpにこんな感じで記載
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call('AdminTableSeeder');
        $this->command->info('Admin table seeded!');
    }
}

class AdminTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('admin')->delete();

        \App\Models\Admin::create([
            'login_id' => 'admin_test',
            'name' => 'admin_test',
        ]);
    }
}
```
```:seedの実行　admin,companyのテーブルにデータをいれてる
$ php artisan migrate --seed
Nothing to migrate.
Seeded: AdminTableSeeder
Admin table seeded!
```
注意：
自動番号振り当ての設定（シーケンス番号）のカラム設定している場合、database/seeds/DatabaseSeeder.php　にデータ設定はしないですが、--seed　で実行するたびにオートインクリメントされる。

```:Seederに追加したクラスだけを実行する場合はこれで解決
$ php artisan db:seed --class=追加したTableSeeder
```
もし、以下の様なエラーが出た場合は、

```
<!! 真っ赤なエラー
 [ReflectionException]                     
  Class DivisionTableSeeder does not exist                                            
<!!
```
comporserのクラス管理がうまくいってないので、dump-autoloadをしてあげてからseedをすればうまくいきます。

```
$ composer dump-autoload
Generating autoload files
```
オートインクリメントも1からにしたい、seedを読み直したいのであれば、refreshしてあげればいいです。

```
$ php artisan migrate:refresh --seed
Rolled back: 2016_01_14_022654_create_admin_table
Migrated: 2016_01_14_022654_create_admin_table
Seeded: AdminTableSeeder
```

###＜ちょっと脱線＞
migrate だけで実行すると、userとpasswordテーブルは作られるみたいです。
[こんな記事](http://qiita.com/maimai-swap/items/5b2f285f7647690472fc#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%AA%8D%E8%A8%BC%E3%82%92%E5%AE%9F%E8%A3%85)みつけたので試してみました。

```:ユーザー認証のプログラムを自動生成
$ php artisan make:auth
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/auth/login.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/auth/register.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/auth/passwords/email.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/auth/passwords/reset.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/auth/emails/password.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/layouts/app.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/home.blade.php
Created View: /Applications/MAMP/htdocs/pj_laravel5/resources/views/welcome.blade.php
Installed HomeController.
Updated Routes File.
Authentication scaffolding generated successfully!
```
なんかviewsにいろいろ作られたっぽいです！
viewsにできるのはHTMLのはず。。どんなサイトができているのか確認

```
$ php artisan route:list
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| Domain | Method   | URI                     | Name | Action                                                          | Middleware |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
|        | GET|HEAD | /                       |      | Closure                                                         |            |
|        | GET|HEAD | home                    |      | App\Http\Controllers\HomeController@index                       | web,auth   |
|        | GET|HEAD | login                   |      | App\Http\Controllers\Auth\AuthController@showLoginForm          | web,guest  |
|        | POST     | login                   |      | App\Http\Controllers\Auth\AuthController@login                  | web,guest  |
|        | GET|HEAD | logout                  |      | App\Http\Controllers\Auth\AuthController@logout                 | web        |
|        | POST     | password/email          |      | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,guest  |
|        | POST     | password/reset          |      | App\Http\Controllers\Auth\PasswordController@reset              | web,guest  |
|        | GET|HEAD | password/reset/{token?} |      | App\Http\Controllers\Auth\PasswordController@showResetForm      | web,guest  |
|        | GET|HEAD | register                |      | App\Http\Controllers\Auth\AuthController@showRegistrationForm   | web,guest  |
|        | POST     | register                |      | App\Http\Controllers\Auth\AuthController@register               | web,guest  |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
```
app/Http/routes.php　の一番最後にコントローラが追記されたようです。
そして、app/Http/Controllers/HomeController.php や resources/views/home.blade.php も作成されたようです。

```app/Http/routes.php
Route::group(['middleware' => 'web'], function () {
    Route::auth();

    Route::get('/home', 'HomeController@index');
});
```
ブラウザでアクセス：http://pj_laravel5.dev:8888/home　
すれば/loginページに飛びます。
![スクリーンショット 2016-01-12 17.56.34.png](https://qiita-image-store.s3.amazonaws.com/0/39911/e5914b7c-b587-6b42-2db7-57a528c67366.png)