Laravel5のお勉強 -第五回 テストデータをFakerで挿入-

# Laravel5のお勉強
[第一回 環境構築](http://qiita.com/yu_eguchi/items/0426ea0a41489e96dd33)
[第二回 ControllerとViewの追加](http://qiita.com/yu_eguchi/items/d6ac0fa3e0014db536c3)
[第三回 Database連携(Mysql)](http://qiita.com/yu_eguchi/items/e272a8d34e714f8249df)
[第四回 モデルの作成/tinker紹介](http://qiita.com/yu_eguchi/items/419a2a081ff142ecf67f)
[第五回 テストデータの挿入/Fakerの使用](http://qiita.com/yu_eguchi/items/9af6eed45e14505f6ecc)
[第六回 CRUDの作成](http://~)
[第七回 Herokuにdeploy](http://qiita.com/yu_eguchi/items/34fce39a07c79591f4af)

# 第五回 テストデータの挿入/Fakerの使用-
## 前提条件
Mac OS yosemite
PHP 5.5以上
Mysql 5.6以上

## 目的
Laravel5のお勉強。
[ここ](http://laravel.jp/)が公式の日本語翻訳サイト

ControllerもテーブルもModelも作成し、そろそろCRUDアプリを作りますかというところで、
今回は、テストデータを挿入し、CRUDを一通り体感できる環境を作ろうと思います。

地道に手でぽちぽちとテストデータを入れても構わないのですが、Fakerを利用して手軽に
データ投入を行っていきましょう。

## マスアサインメントとfillableの指定

Laravelではseederと呼ばれる、データ投入機構が用意されてます。
seederを利用してデータを投入していき、seederの中でFakerを利用するわけなのですが、
実は事前に一つやらなければいけないことがあります。

それが<font color="red">**マスアサインメント(MassAssignment)**</font>です。
つまりある程度固まったデータをModelを介して、DBに挿入することをさすのですが、
まずはtinkerを立ち上げ、以下を実行してみてください。

```
$ php artisan tinker
>>> App\Article::create(['title' => 'ほげ', 'body' => 'ふが', 'published_at' => Carbon\Carbon::now()]);
Illuminate\Database\Eloquent\MassAssignmentException with message 'title'
```

エラーがでます。
これは、セキュリティの観点から、外部からなんでも挿入させないよう制限されているためです。
例えば、ユーザーがリクエストした情報をそのままDBに入れてしまわないようにすることが挙げられます。
そのため、Modelに、何のカラムなら外から入れられるかを**fillable**で宣言する必要があります。

```
<?php namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Article extends Model {
     
    protected $fillable = ['title', 'body', 'published_at'];
     
}
```

こんな感じです。これでマスアサインメントが可能となります。
tinkerを立ち上げ、先ほどのコマンドを打ってみて。

## 今度こそseederの作成

seederを作成し、DBに初期データを投入します。
まず、seederは大元のDatabaseSeeder.phpがあるので、そこに独自seederの読み込み設定を記載します。

```
$pwd(Blog/database/seeds)
$ tree
seeds
└── DatabaseSeeder.php
```

DatabaseSeederの中身は以下に

```
     1	<?php
     2	
     3	use Illuminate\Database\Seeder;
     4	use Illuminate\Database\Eloquent\Model;
     5	
     6	class DatabaseSeeder extends Seeder
     7	{
     8	    /**
     9	     * Run the database seeds.
    10	     *
    11	     * @return void
    12	     */
    13	    public function run()
    14	    {
    15	        Model::unguard();
    16	        $this->call('ArticlesTableSeeder');
    17	        Model::reguard();
    18	    }
    19	}
```

runの中に記載されてる

```
$this->call('ArticlesTableSeeder');
```

はこれから新規作成していただくseederになります。
Artuicleテーブルへの初期データ投入用のseederです。
では、同じ階層に**vi ArticlesTableSeeder.php**
をしましょう。

```
<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

use Faker\Factory as Faker;
use Carbon\Carbon;
use App\Article;

class ArticlesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('articles')->delete();
        $faker = Faker::create('en_US');
        
        for ($i = 0; $i < 10; $i++) {
            Article::create([
                'title' => $faker->sentence(),
                'body' => $faker->paragraph(),
                'published_at' => Carbon::today()
            ]);
        }

    }
}
```

for文の中でFakerを利用して、10回データを投入してます。
なお、はじめにEloquentのdeleteを流し、データを初期化してます。
Fakerは自動でテストデータをランダムに投入してくれる、日本語のデータも可能な評価の高いライブラリ。

## データ投入

```
$ php artisan db:seed
Seeded: ArticlesTableSeeder
```

これでDatabaseSeederが実行され、中のArticleSeederが読み込まれ、Fakerが10回実行されます。

tinkerでEloquentを利用して、データが投入されているか見てみましょう。

```
Psy Shell v0.5.2 (PHP 5.5.27 — cli) by Justin Hileman
>>> App\Article::all();
=> Illuminate\Database\Eloquent\Collection {#698
     all: [
       App\Article {#699
         id: 4,
         title: "Illo aliquam distinctio illum.",
         body: "Totam cumque distinctio et. Fugiat debitis maxime consequatur cumque. Blanditiis ut magnam provident exercitationem dolor tenetur.",
         created_at: "2015-10-11 12:48:14",
         updated_at: "2015-10-11 12:48:14",
         published_at: "2015-10-11 00:00:00",
       },
       App\Article {#700
         id: 5,
         title: "Earum enim quia dicta a et omnis nesciunt quos.",
         body: "Iure asperiores mollitia aut facere harum. Doloremque vel id fuga voluptatibus ut aliquid reiciendis. Rerum dolorem deleniti architecto reiciendis similique. Inventore unde vel fugit enim alias asperiores ea quis. Consequatur sit non veritatis dolorum ipsam voluptatem.",
         created_at: "2015-10-11 12:48:14",
         updated_at: "2015-10-11 12:48:14",
         published_at: "2015-10-11 00:00:00",
       },
       App\Article {#701
         id: 6,
         title: "Illum earum animi cum nisi explicabo.",
         body: "Autem possimus est excepturi. Autem in fugiat blanditiis molestiae. Enim voluptas quidem maxime eum enim voluptatem reiciendis.",
         created_at: "2015-10-11 12:48:14",
         updated_at: "2015-10-11 12:48:14",
         published_at: "2015-10-11 00:00:00",
       },
       App\Article {#702
         id: 7,
         title: "Unde delectus modi dolore corporis dolores facilis repudiandae.",
         body: "Iure enim ipsa neque repellat. Voluptatibus voluptates et quia voluptatibus assumenda. Id labore vitae excepturi aut non.",
         created_at: "2015-10-11 12:48:14",
         updated_at: "2015-10-11 12:48:14",
         published_at: "2015-10-11 00:00:00",
       },
省略
```

どーよ!!