LoginSignup
13
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-10-12

Laravel5のお勉強

第一回 環境構築
第二回 ControllerとViewの追加
第三回 Database連携(Mysql)
第四回 モデルの作成/tinker紹介
第五回 テストデータの挿入/Fakerの使用
第六回 CRUDの作成
第七回 Herokuにdeploy

第五回 テストデータの挿入/Fakerの使用-

前提条件

Mac OS yosemite
PHP 5.5以上
Mysql 5.6以上

目的

Laravel5のお勉強。
ここが公式の日本語翻訳サイト

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

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

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

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

それがマスアサインメント(MassAssignment)です。
つまりある程度固まったデータを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",
       },
省略

どーよ!!

13
14
1

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
13
14