しぐれがき

これまで挑戦したことの備忘録です

【投稿アプリ自作(6)】seederでダミーデータの作成(Laravel)

f:id:shiguregaki:20170731072123j:plain
Webアプリを自作するためにPHPフレームワークのLaravelを導入することに決めました。
PHP初心者かつLaravel初心者ですが、自分なりにスキルを得るためにLaravelを用いた記事投稿アプリを自作しました。その過程を備忘録としてまとめます。
最終的にはブラウザを利用して記事投稿画面の表示、ユーザごとの記事投稿数のグラフ化を目指したいと思います。
本記事は連載【投稿アプリ自作】の第六回目で、Seederでダミーデータを作成する方法をまとめます。
※:Laravelは5.3からファイル構成が大幅に変わりました。本記事ではLaravel5.3以降を使って説明したいと思います。
※2:データベースはXAMPPに入っていたMySQLを使うことにします。事前にデータベースアカウントを登録しておいてください。

目次

ゴール

本記事では、以下の2つについてまとめます。
・Seederファイルの変更
・Sedderを実行してダミーデータの作成

以下の画像ではSeederによって第四回目で設計したDetailedArticlesテーブルにダミーデータを作成しました。
その他のテーブルにも同様にダミーデータを作成することを目指します。

f:id:shiguregaki:20170731072144j:plain

必要なもの

必要なもの 価格(円)
1 PC ピンキリ
備考 インターネット接続可能なこと
2 XAMPP 無料
備考 持っていない場合は、こちらを参照→
XAMPPのインストール方法 - しぐれがき
3 Composer 無料
備考 持っていない場合は、こちらを参照→
Composerのインストール - しぐれがき
4 Laravelフレームワーク 無料
備考 インストールしていない場合は、こちらを参照→
最近話題のPHPフレームワーク『Laravel5』をインストールする! - しぐれがき
5 MySQLのデータベースアカウント 無料
備考 持っていない場合は、こちらを参照→
phpMyAdminでデータベースとユーザを新規登録する - しぐれがき
6 投稿アプリ向けのテーブル 無料
備考 【投稿アプリ自作】の第四回目で作成した投稿アプリ向けのテーブルです。持っていない場合は、こちらを参照→【投稿アプリ自作(4)】テーブル設計とマイグレーション実行(Laravel) - しぐれがき




事前準備

テーブルの作成

事前に投稿アプリ向けのテーブルを用意する必要があります。
第四回目でテーブル設計と新規テーブルの作成方法をまとめていますので、まだ作成していない方は以下の記事を参考にして新規テーブルの作成をしてください。

shiguregaki.hatenablog.com



テーブルの関連性

投稿アプリ向けのテーブルの関連性をER図にまとめると下の様になります。(IDEDF1X記法で記述)
※ネットで検索しながら見よう見まねで書いたので間違っているかもしれませんがご容赦ください。

f:id:shiguregaki:20170731072203j:plain




ダミーデータの設計

Seederの機能を使ってダミーデータを作成していくのですが、実際の中身は何を使うのかはこちらで決定しないといけません。
この章では以下の各テーブルのダミーデータを設計します。
・Articlesテーブル
・DetailedArticlesテーブル
・ArticleUsersテーブル
・Categoriesテーブル
・Tagsテーブル


Articlesテーブルのダミーデータの設計

Articlesテーブルのカラムは【投稿アプリ自作】の第四回目で以下の様に設計しました。

Articlesテーブル
記事を管理するテーブルです。各記事はユーザやカテゴリー、タグを紐づけられています。

カラム名 変数名 補足
記事ID article_id 主キー
ユーザID user_id 外部キー
ユーザごとの記事ID user_article_id
カテゴリーID category_id 外部キー
タグID tag_id 外部キー





Articlesテーブルのダミーデータ
このテーブルはIDばかりでその他のテーブルの紐づけに使用します。
ダミーデータは以下の様にしたいと思います。

記事ID ユーザID ユーザごとの記事ID カテゴリーID タグID
11111
21223
32111
41322
53146
63235
71435
82234
93335
102334
111511
123422
133535
142434
151611
162524
173611
183711
192623
201711



DetailedArticlesテーブルのダミーデータの設計

DetailedArticlesテーブルのカラムは【投稿アプリ自作】の第四回目で以下の様に設計しました。

DetailedArticlesテーブル
記事詳細を管理するテーブルです。Articlesテーブルとarticle_idで1:1に関連を持っています。

カラム名 変数名 補足
記事ID article_id 主キー 外部キー
タイトル title
記事内容 body
投稿日 published_date






DetailedArticlesテーブルのダミーデータ
このテーブルはタイトルや内容など記事の具体的な内容を格納します。
ダミーデータは以下の様にしたいと思います。

記事ID タイトル 内容 投稿日
1自己紹介!はじめまして、ケンです。よろしく!2017-04-01
2おすすめイタリアン!このイタリア料理店おすすめです!2017-04-01
3自己紹介ですこんにちは、エミリーです。よろしくです。2017-04-01
4おすすめ和食この和食屋もおすすめです!ぜひ!2017-04-01
5北海道旅行今日は北海道にいます。寒い。。。2017-04-01
6最近の仕事仕事で外回り多い。明日は仕事で沖縄だ2017-04-01
7つぶやき今からバイトだ。支度しなきゃ!2017-04-01
8友人の結婚式明日は友達の結婚式だわ!2017-04-02
9移動中です沖縄行の飛行機のなか。ハードだぜ!2017-04-02
10お祝儀について友人のお祝儀は3萬でいいよね?2017-04-02
11沖縄旅行に出発今から沖縄旅行にいってきます!2017-04-02
12沖縄めし沖縄に到着。飯がうまいぜ2017-04-02
13沖縄堪能します仕事はさっさと片付けて沖縄堪能するぞ2017-04-03
14友人の結婚式ドレスがきれいだわ2017-04-03
15やばい財布落とした!!!2017-04-03
16結婚式のごはん結婚式場のごはんっておいしいですよね2017-04-03
17どうしよう財布を拾ってしまった。。。2017-04-03
18交番とりあえず、拾った財布は交番に届けた2017-04-03
19結婚式の二次会おしゃれなイタリアレストランにて2017-04-03
20財布ありました近くの交番に届けられてた。よかったあ2017-04-03



ArticleUsersテーブルのダミーデータの設計

Articlesテーブルのカラムは【投稿アプリ自作】の第四回目で以下の様に設計しました。

ArticleUsersテーブル
記事を書くユーザを管理するテーブルです。Articlesテーブルとuser_idで1:多に関連を持っています。

カラム名 変数名 補足
ユーザID user_id 主キー
ユーザ名 user_name
パスワード password
性別 gender
メールアドレス mail_address






ArticleUsersテーブルのダミーデータ
このテーブルは記事アプリを利用するユーザの情報を格納します。
ダミーデータは以下の様にしたいと思います。

ユーザID ユーザ名 パスワード 性別 メールアドレス
1ケンken12345k-e-n-0123@ken.com
2エメリーemily111e-mi-ly-111@emy.com
3ボブbobbob3boooob123@bob.com



Categoriesテーブルのダミーデータの設計

Categoriesテーブルのカラムは【投稿アプリ自作】の第四回目で以下の様に設計しました。

Categoriesテーブル
記事のカテゴリーを管理するテーブルです。Articlesテーブルとcategory_idで1:多に関連を持っています。

カラム名 変数名 補足
カテゴリーID category_id 主キー
カテゴリー名 category_name






Categoriesテーブルのダミーデータ
カテゴリーテーブルは記事のカテゴリーをまとめています。
ダミーデータは以下の様にしたいと思います。

カテゴリーID カテゴリー名
1カテゴリーなし
2食と酒
3暮らしと生活
4旅行




Tagsテーブルのダミーデータの設計

Tagsテーブルのカラムは【投稿アプリ自作】の第四回目で以下の様に設計しました。

Tagsテーブル
記事のタグを管理するテーブルです。Articlesテーブルとtag_idで1:多に関連を持っています。

カラム名 変数名 補足
タグID tag_id 主キー
タグ名 tag_name






Tagsテーブルのダミーデータ
タグテーブルは記事のタグをまとめています。
ダミーデータは以下の様にしたいと思います。

タグID タグ名
1タグなし
2和食
3イタリアン
4冠婚葬祭
5仕事
6北海道
7沖縄





Laravelソースファイルの変更

変更や新規作成するLaravelファイル一覧

Laravelのプロジェクトファイル配下にあるファイルで本記事の中で変更、新規作成するファイルについてまとめました。

ファイル名 対応 備考
1
database/seeds/DatabaseSeeder.php
変更
2
database/seeds/seed/Articles.csv
新規作成 database/seeds/seedディレクトリも新規作成
3
database/seeds/seed/ArticleUser.csv
新規作成 同上
4
database/seeds/seed/Categories.csv
新規作成 同上
5
database/seeds/seed/DetailedArticles.csv
新規作成 同上
6
database/seeds/seed/Tags.csv
新規作成 同上




Seederファイルの変更

まずはSeederファイルを変更します。
Seederファイルは以下のディレクトリに格納されています。

Seederファイルの格納ディレクトdatabase/seeds/

ここに格納されたDatabaseSeeder.phpがSeederファイルになります。
このファイルに各テーブルにダミーデータを格納するように処理を追加します。
また、各ダミーデータはcsvから読み取るようにします。csvの内容については後述します。

DatabaseSeeder.phpを以下の様に変更します。
※このとき$this->call(で呼び出す関数の順番には外部キー制約がついているため注意が必要です。
具体的にはArticleUsersテーブル/Categoriesテーブル/Tagsテーブル => Articlesテーブル => DetailedArticlesテーブル の順番で実行する必要があります。

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use App\ArticleUser;
use App\Category;
use App\Tag;
use App\DetailedArticle;
use App\Article;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();
        $this->call(ArticleUsersTableSeeder::class);
        $this->call(CategoriesTableSeeder::class);
        $this->call(TagsTableSeeder::class);
        $this->call(ArticlesTableSeeder::class);
        $this->call(DetailedArticlesTableSeeder::class);
        Model::reguard();
    }
}
class ArticleUsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('article_users')->delete();

        $filepath="E:\\xampp\\htdocs\\article-test-apl\\database\\seeds\\seed\\ArticleUser.csv";
        $file = new SplFileObject($filepath); 
        $file->setFlags(SplFileObject::READ_CSV);

        foreach ($file as $line) {
            if(is_null($line[0])){
                continue;
            }else{
                ArticleUser::create([
                    'user_name' => $line[1],
                    'password' => $line[2],
                    'gender' => $line[3],
                    'mail_address' => $line[4]
                ]);
            }
        }
    }
}
class CategoriesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('categories')->delete();

        $filepath="E:\\xampp\\htdocs\\article-test-apl\\database\\seeds\\seed\\Categories.csv";
        $file = new SplFileObject($filepath); 
        $file->setFlags(SplFileObject::READ_CSV);

        foreach ($file as $line) {
            if(is_null($line[0])){
                continue;
            }else{
                Category::create([
                    'category_name' => $line[1]
                ]);
            }
        }
    }
}
class TagsTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('tags')->delete();

        $filepath="E:\\xampp\\htdocs\\article-test-apl\\database\\seeds\\seed\\Tags.csv";
        $file = new SplFileObject($filepath); 
        $file->setFlags(SplFileObject::READ_CSV);

        foreach ($file as $line) {
            if(is_null($line[0])){
                continue;
            }else{
                Tag::create([
                    'tag_name' => $line[1]
                ]);
            }
        }
    }
}
class DetailedArticlesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('detailed_articles')->delete();

        $filepath="E:\\xampp\\htdocs\\article-test-apl\\database\\seeds\\seed\\DetailedArticles.csv";
        $file = new SplFileObject($filepath); 
        $file->setFlags(SplFileObject::READ_CSV);

        foreach ($file as $line) {
            if(is_null($line[0])){
                continue;
            }else{
                DetailedArticle::create([
                    'article_id' => $line[0],
                    'title' => $line[1],
                    'body' => $line[2],
                    'published_date' => date("Y-m-d 10:00:00",strtotime($line[3]))
                ]);
            }
        }
    }
}
class ArticlesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('articles')->delete();

        $filepath="E:\\xampp\\htdocs\\article-test-apl\\database\\seeds\\seed\\Articles.csv";
        $file = new SplFileObject($filepath); 
        $file->setFlags(SplFileObject::READ_CSV);

        foreach ($file as $line) {
            if(is_null($line[0])){
                continue;
            }else{
                Article::create([
                    'user_id' => $line[1],
                    'user_article_id' => $line[2],
                    'category_id' => $line[3],
                    'tag_id' => $line[4]
                ]);
            }
        }
    }
}






csvファイルの新規作成

上で変更したDatabaseSeeder.php内ではcsvファイルを読みだしてダミーデータを設定しています。
本章ではそのcsvファイルについてまとめます。

csvファイルは下記ディレクトリに格納してます。

csvファイルの格納ディレクトdatabase/seeds/seed/






それぞれの内容については下記です。

Articles.csv




1,1,1,1,1
2,1,2,2,3
3,2,1,1,1
4,1,3,2,2
5,3,1,4,6
6,3,2,3,5
7,1,4,3,5
8,2,2,3,4
9,3,3,3,5
10,2,3,3,4
11,1,5,1,1
12,3,4,2,2
13,3,5,3,5
14,2,4,3,4
15,1,6,1,1
16,2,5,2,4
17,3,6,1,1
18,3,7,1,1
19,2,6,2,3
20,1,7,1,1



ArticleUser.csv




1,ケン,ken12345,男,k-e-n-0123@ken.com
2,エミリー,emily111,女,e-mi-ly-111@emy.com
3,ボブ,bobbob3,男,boooob123@bob.com



Categories.csv




1,カテゴリーなし
2,食と酒
3,暮らしと生活
4,旅行



DetailedArticles.csv




1,自己紹介!,はじめまして、ケンです。よろしく!,2017-04-01
2,おすすめイタリアン!,このイタリア料理店おすすめです!,2017-04-01
3,自己紹介です,こんにちは、エミリーです。よろしくです。,2017-04-01
4,おすすめ和食,この和食屋もおすすめです!ぜひ!,2017-04-01
5,北海道旅行,今日は北海道にいます。寒い。。。,2017-04-01
6,最近の仕事,仕事で外回り多い。明日は仕事で沖縄だ,2017-04-01
7,つぶやき,今からバイトだ。支度しなきゃ!,2017-04-01
8,友人の結婚式,明日は友達の結婚式だわ!,2017-04-02
9,移動中です,沖縄行の飛行機のなか。ハードだぜ!,2017-04-02
10,お祝儀について,友人のお祝儀は3萬でいいよね?,2017-04-02
11,沖縄旅行に出発,今から沖縄旅行にいってきます!,2017-04-02
12,沖縄めし,沖縄に到着。飯がうまいぜ,2017-04-02
13,沖縄堪能します,仕事はさっさと片付けて沖縄堪能するぞ,2017-04-03
14,友人の結婚式,ドレスがきれいだわ,2017-04-03
15,やばい,財布落とした!!!,2017-04-03
16,結婚式のごはん,結婚式場のごはんっておいしいですよね,2017-04-03
17,どうしよう,財布を拾ってしまった。。。,2017-04-03
18,交番,とりあえず、拾った財布は交番に届けた,2017-04-03
19,結婚式の二次会,おしゃれなイタリアレストランにて,2017-04-03
20,財布ありました,近くの交番に届けられてた。よかったあ,2017-04-03



Tags.csv




1,タグなし
2,和食
3,イタリアン
4,冠婚葬祭
5,仕事
6,北海道
7,沖縄




Seederの実行

Seederを実行するにはコマンドプロンプトで以下のコマンドを入力します。


 Seeder実行コマンド 
>php artisan db:seed

f:id:shiguregaki:20170731072219j:plain




データベースの確認

データベースが正しく作成されているか確認するため、phpMyAdminにアクセスします。
ブラウザでphpMyAdmin(以下のURL)にアクセスしてください。

phpMyAdminのアクセス先http://localhost/phpmyadmin

今回の記事で以下の5つのテーブルについてダミーデータを設定したのでそれぞれ確認してきます。
・articles(Articlesテーブル)
・detatiled_articles(DetatiledArticlesテーブル)
・article_users(ArticleUsersテーブル)
・categories(Categoriesテーブル)
・tags(Tagsテーブル)





Articlesテーブルの確認

phpMyAdminの左側にあるメニューでarticles(Articlesテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。

f:id:shiguregaki:20170731072230j:plain




DetatiledArticlesテーブルの確認

phpMyAdminの左側にあるメニューでdetailed_articles(DetatiledArticlesテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。

f:id:shiguregaki:20170731072240j:plain




ArticleUsersテーブルの確認

phpMyAdminの左側にあるメニューでarticle_users(ArticleUsersテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。

f:id:shiguregaki:20170731072250j:plain





Categoriesテーブルの確認

phpMyAdminの左側にあるメニューでcategories(Categoriesテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。

f:id:shiguregaki:20170731072259j:plain




Tagsテーブルの確認

phpMyAdminの左側にあるメニューでtags(Tagsテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。

f:id:shiguregaki:20170731072308j:plain

これで設計した通りにダミーデータを作成することができました。

まとめ

この記事では以下の2つについてまとめました。
・Seederファイルの変更
・Sedderを実行してダミーデータの作成

これでダミーデータを作成することができたので、コントローラでデータベースにアクセスしてデータを取得することができます。
ですので、次回は記事を操作するコントローラー(ArticleController.php)を変更して、ダミーデータにアクセスしたいと思います。



次回記事

次回記事はコントローラでデータベースにアクセスし、ダミーデータを画面上に表示する方法についてまとめたいと思います。

http://shiguregaki.hatenablog.com/entry/p48shiguregaki.hatenablog.com




前回記事

shiguregaki.hatenablog.com



以上!