【投稿アプリ自作(6)】seederでダミーデータの作成(Laravel)
Webアプリを自作するためにPHPのフレームワークのLaravelを導入することに決めました。
PHP初心者かつLaravel初心者ですが、自分なりにスキルを得るためにLaravelを用いた記事投稿アプリを自作しました。その過程を備忘録としてまとめます。
最終的にはブラウザを利用して記事投稿画面の表示、ユーザごとの記事投稿数のグラフ化を目指したいと思います。
本記事は連載【投稿アプリ自作】の第六回目で、Seederでダミーデータを作成する方法をまとめます。
※:Laravelは5.3からファイル構成が大幅に変わりました。本記事ではLaravel5.3以降を使って説明したいと思います。
※2:データベースはXAMPPに入っていたMySQLを使うことにします。事前にデータベースアカウントを登録しておいてください。
目次
ゴール
本記事では、以下の2つについてまとめます。
・Seederファイルの変更
・Sedderを実行してダミーデータの作成
以下の画像ではSeederによって第四回目で設計したDetailedArticlesテーブルにダミーデータを作成しました。
その他のテーブルにも同様にダミーデータを作成することを目指します。
必要なもの
必要なもの | 価格(円) | ||
---|---|---|---|
1 | PC | ピンキリ | |
備考 | インターネット接続可能なこと | ||
2 | XAMPP | 無料 | |
備考 | 持っていない場合は、こちらを参照→ XAMPPのインストール方法 - しぐれがき |
||
3 | Composer | 無料 | |
備考 | 持っていない場合は、こちらを参照→ Composerのインストール - しぐれがき |
||
4 | Laravelフレームワーク | 無料 | |
備考 | インストールしていない場合は、こちらを参照→ 最近話題のPHPフレームワーク『Laravel5』をインストールする! - しぐれがき |
||
5 | MySQLのデータベースアカウント | 無料 | |
備考 | 持っていない場合は、こちらを参照→ phpMyAdminでデータベースとユーザを新規登録する - しぐれがき |
||
6 | 投稿アプリ向けのテーブル | 無料 | |
備考 | 【投稿アプリ自作】の第四回目で作成した投稿アプリ向けのテーブルです。持っていない場合は、こちらを参照→【投稿アプリ自作(4)】テーブル設計とマイグレーション実行(Laravel) - しぐれがき |
事前準備
テーブルの作成
事前に投稿アプリ向けのテーブルを用意する必要があります。
第四回目でテーブル設計と新規テーブルの作成方法をまとめていますので、まだ作成していない方は以下の記事を参考にして新規テーブルの作成をしてください。
テーブルの関連性
投稿アプリ向けのテーブルの関連性をER図にまとめると下の様になります。(IDEDF1X記法で記述)
※ネットで検索しながら見よう見まねで書いたので間違っているかもしれませんがご容赦ください。
ダミーデータの設計
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 |
---|---|---|---|---|
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 |
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 | ケン | ken12345 | 男 | k-e-n-0123@ken.com |
2 | エメリー | emily111 | 女 | e-mi-ly-111@emy.com |
3 | ボブ | bobbob3 | 男 | boooob123@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ファイルは以下のディレクトリに格納されています。
ここに格納された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ファイルについてまとめます。
それぞれの内容については下記です。
Articles.csv
ArticleUser.csv
Categories.csv
DetailedArticles.csv
Tags.csv
Seederの実行
Seederを実行するにはコマンドプロンプトで以下のコマンドを入力します。
データベースの確認
データベースが正しく作成されているか確認するため、phpMyAdminにアクセスします。
ブラウザでphpMyAdmin(以下のURL)にアクセスしてください。
今回の記事で以下の5つのテーブルについてダミーデータを設定したのでそれぞれ確認してきます。
・articles(Articlesテーブル)
・detatiled_articles(DetatiledArticlesテーブル)
・article_users(ArticleUsersテーブル)
・categories(Categoriesテーブル)
・tags(Tagsテーブル)
Articlesテーブルの確認
phpMyAdminの左側にあるメニューでarticles(Articlesテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。
DetatiledArticlesテーブルの確認
phpMyAdminの左側にあるメニューでdetailed_articles(DetatiledArticlesテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。
ArticleUsersテーブルの確認
phpMyAdminの左側にあるメニューでarticle_users(ArticleUsersテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。
Categoriesテーブルの確認
phpMyAdminの左側にあるメニューでcategories(Categoriesテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。
Tagsテーブルの確認
phpMyAdminの左側にあるメニューでtags(Tagsテーブル)を選択します。
するとダミーデータの章で設計したデータが格納されていることが分かります。
これで設計した通りにダミーデータを作成することができました。
まとめ
この記事では以下の2つについてまとめました。・Seederファイルの変更
・Sedderを実行してダミーデータの作成
これでダミーデータを作成することができたので、コントローラでデータベースにアクセスしてデータを取得することができます。
ですので、次回は記事を操作するコントローラー(ArticleController.php)を変更して、ダミーデータにアクセスしたいと思います。
次回記事
次回記事はコントローラでデータベースにアクセスし、ダミーデータを画面上に表示する方法についてまとめたいと思います。http://shiguregaki.hatenablog.com/entry/p48shiguregaki.hatenablog.com
前回記事
以上!