スクリーンショット_2020-01-17_19

Laravel6.0(PHP7.3)+MySQL+Laradockで簡易的なECサイトを作る②

ご苦労様です。
向江です。

前回の記事に引き続きECサイトを作っていきたいと思います。
cartsテーブルを作る課題の方は終わってますでしょうか?

前回?って方は記事をすっ飛ばしてると思いますので
こちらの記事からスタートしてくださいね

https://note.com/mukae9/n/n12cc13fd4f90

1、Cartsテーブルを作成する

前回の課題だったテーブルの作成です。
作成方法については前回の記事で触れていますのでここでは答えだけ載せておきます!

まずはmigrationファイルを作成

php artisan make:migration create_carts_table

 migrationに必要な構成を追加

<?php

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

class CreateCartsTable extends Migration
{
   /**
    * Run the migrations.
    *
    * @return void
    */
   public function up()
   {
       Schema::create('carts', function (Blueprint $table) {
           $table->bigIncrements('id');
           $table->integer('stock_id');
           $table->integer('user_id');
           $table->timestamps();
       });
   }

   /**
    * Reverse the migrations.
    *
    * @return void
    */
   public function down()
   {
       Schema::dropIfExists('carts');
   }
}
php artisan migrate

ですね!(migrateはコンテナの中で!)

これで前回作った商品の一覧を格納するstocksテーブルと、
カート情報を格納するcartsテーブルが作成されました。
また同時にLaravelにもともと準備されているusersテーブルなども作成されています。

スクリーンショット 2020-01-18 16.27.39


ちなみに
「いやいやいやいや、なんでこんな面倒な事してテーブル作るの?phpMyadminとかから直接作ればいいじゃん?もしかして知らないの?ぷぷ〜」
って意見がありそうですが、

確かに。
一人で開発、しかも学習の時点ではあまりメリットを感じないかもしれません。

ただプログラミングは基本的に「チーム開発」するものです。
一番わかりやすい例としてはチームのAさんがこのmigrationファイルを作り共有さえすればチームのBさんも、Cさんも全く同じ内容のテーブルを構築することが出来ます。しかもコマンド一発で。
(無かったとしたらそれぞれが準備して、カラムの型が違ったりなんだったりが容易に想像できますね。)

今後プログラミングで「なんでこんな面倒なことするの?」ってところは
大体が「チーム開発の時のメリット」を少し想像して見ると意味が見えてくるかもしれません。


それでは続いてはシーダーを利用して、
stocksテーブルに商品情報を格納していきます。

2、シーダーを利用するために

シーダーとはテーブルに情報を挿入していくためのものです。
これもmigrationと同じくチーム内共有をしたり、1000くらいのレコードを一気にfor文で挿入したり色々なメリットがあります。
Factory機能などでより具体的なダミーデータを挿入したりもできますが、今回はECサイトなので商品データをこちらで準備することとします。

まずはseederファイルを作成します。
appフォルダ上で、

php artisan make:seed StockTableSeeder

を実行します。
すると
appフォルダの中のdatabaseフォルダの中の
seedsフォルダの中に
StockTableSeederというシーダーファイルが作成されています。

中身を見てみましょう。

<?php

use Illuminate\Database\Seeder;

class StockTableSeeder extends Seeder
{
   /**
    * Run the database seeds.
    *
    * @return void
    */
   public function run()
   {
       //
   }
}

ここでもuseでSeederクラスを利用できるようにして
そのクラスを引き継ぐ形になっています。

ちなみに今回も同じくこのSeederクラスは
venderフォルダ内におります。
正確にいうとvender/laravel/framework/Databese/Seeder.phpですね。

深追いすると沼が待っていますので初学者はそのクラスを利用したらシーダー機能を使えるんだ!くらいで良いかと思います。

さて、
上記のコードのままでは当然シーダーとしては役に立たないので
追加記入をしていきます。

ここで意識することは
「シーダーとはテーブルに情報を挿入する機能」ということです。
つまり、やることは
「テーブルにSQLのINSERTで情報を挿入する」
ということです。

よく考えたら当たり前のことなのですが、変にシーダーを難しく考えてしまう原因にもなっているので、まずはシーダーとは便利にテーブルの基盤情報となるSQLを実行できるんだ〜と考えると習得がスムーズかもしれません。

なので基本的にシーダーファイルにはデータベースに情報を挿入するための
■Eloquant
■DBファサード
あたりのどれかが必要となってきます。

今回はDBファサードを利用したいと思います。

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; //追記

class StockTableSeeder extends Seeder
{
   /**
    * Run the database seeds.
    *
    * @return void
    */
   public function run()
   {
       DB::table('stocks')->truncate(); //2回目実行の際にシーダー情報をクリア
       DB::table('stocks')->insert([
           'name' => 'フィルムカメラ',
           'detail' => '1960年式のカメラです',
           'fee' => 200000,
           'imgpath' => 'filmcamera.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'イヤホン',
           'detail' => 'ノイズキャンセリングがついてます',
           'fee' => 20000,
           'imgpath' => 'iyahon.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => '時計',
           'detail' => '1980年式の掛け時計です',
           'fee' => 120000,
           'imgpath' => 'clock.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => '地球儀',
           'detail' => '珍しい商品です',
           'fee' => 120000,
           'imgpath' => 'earth.jpg',
       ]);


       DB::table('stocks')->insert([
           'name' => '腕時計',
           'detail' => 'プレゼントにどうぞ',
           'fee' => 9800,
           'imgpath' => 'watch.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'カメラレンズ35mm',
           'detail' => '最新式です',
           'fee' => 79800,
           'imgpath' => 'lens.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'シャンパン',
           'detail' => 'パーティにどうぞ',
           'fee' => 800,
           'imgpath' => 'shanpan.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'ビール',
           'detail' => '大量生産されたビールです',
           'fee' => 200,
           'imgpath' => 'beer.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'やかん',
           'detail' => 'かなり珍しいやかんです',
           'fee' => 1200,
           'imgpath' => 'yakan.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => '精米',
           'detail' => '米30Kgです',
           'fee' => 11200,
           'imgpath' => 'kome.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'パソコン',
           'detail' => 'ジャンク品です',
           'fee' => 11200,
           'imgpath' => 'pc.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'アコースティックギター',
           'detail' => 'ヤマハ製のエントリーモデルです',
           'fee' => 25600,
           'imgpath' => 'aguiter.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'エレキギター',
           'detail' => '初心者向けのエントリーモデルです',
           'fee' => 15600,
           'imgpath' => 'eguiter.jpg',
       ]);

       DB::table('stocks')->insert([
           'name' => '加湿器',
           'detail' => '乾燥する季節の必需品',
           'fee' => 3200,
           'imgpath' => 'steamer.jpeg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'マウス',
           'detail' => 'ゲーミングマウスです',
           'fee' => 4200,
           'imgpath' => 'mouse.jpeg',
       ]);

       DB::table('stocks')->insert([
           'name' => 'Android Garxy10',
           'detail' => '中古美品です',
           'fee' => 84200,
           'imgpath' => 'mobile.jpg',
       ]);
   }
}

かなり適当感が溢れていますが、
 16個の商品情報を追加することにしました。

そこの真面目なあなた!
これは流石にコピペして!

特に中身の内容に指定はありませんのでお好きな商品にしてください。

簡単にDBファサードの利用を説明すると
use Illuminate\Support\Facades\DB;
でDBファサードの利用を可能とした上で、

DB::table('stocks')->insert([]);
というDBクエリビルダを実行することでstocksテーブルにINSERTを行います。
INSERTの内容は連想配列で
'カラム名' => '内容',
で持たせています。

さてシーダーファイルが構成できたので
さあコマンド実行と行きたいところですが、
あと2手必要です。

3、実行前のもう一手間



StockTableSeeder.phpファイルが存在するseedsフォルダには、
DatabaseSeeder.phpも最初から存在しています。
このファイルがシーダー機能をつかさどる親みたいなファイルなので、
こちらのファイルにStockTableSeederを利用することを記入して上げる必要があります。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
   /**
    * Seed the application's database.
    *
    * @return void
    */
   public function run()
   {
       $this->call(StockTableSeeder::class); //追記
   }
}

そしてもう一手間。

appフォルダ(laravel自体フォルダ)上で

composer dump-autoload

を実行します。
シーダー機能はPHPのオートロード(つまりはcomposerを使う)を利用しますので上記コマンドが必要となります。
詳しくはこちらをご参考↓
https://laraweb.net/surrounding/1642/

4、シーダー実行


さてここまできたら後は
コンテナ内のappフォルダ(laravel自体フォルダ)上で

php artisan db:seed

を実行するとシーディングが完了します。
phpMyadminなどでstocksテーブルに商品情報が追加されていることがわかるかと思います。

スクリーンショット 2020-01-18 16.38.31

次の記事に行く前の課題

以上で前回の記事と合わせてテーブルの準備と商品情報の挿入が完了しました!

いよいよ次回は商品情報をペジネーションを使って一覧表示させて行きたいと思います。
そして今回も次の記事に行く前の簡単な課題を置いておきますので次に進む前にチャレンジしてみてください。

■migration機能を使ってid(bigIncrements),name(string,50),age(int)カラムを持ったmineテーブルを作る
■MineTableSeederを作成し、自分の名前と年齢をDBファサードで挿入できるようにする。
■シーディングを実行する。

今回は次回の記事で答え合わせは特にしないですが、
これくらいはスムーズにできるといいですね!

それでは次回の記事でお待ちしています!

次の記事

https://note.com/mukae9/n/n2ed6be437f0d

この記事が気に入ったらサポートをしてみませんか?