
マイケル
どうもみなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜〜〜!!

マイケル
今回も前回に続いて、
自動販売機システムを作っていきます!
自動販売機システムを作っていきます!

マイケル
とりあえずはこれで最終回の予定だ!
メインとなる購入画面を作っていくぞ!
メインとなる購入画面を作っていくぞ!

エレキベア
いよいよ大詰めクマ〜〜〜!!
参考書籍

マイケル
基本的な実装方法などは、
前回に引き続きこちらを参考にして進めていきます。
前回に引き続きこちらを参考にして進めていきます。

エレキベア
やったるクマ〜〜〜〜!!
購入画面の仕様

マイケル
さて、第一回で説明しましたが
購入画面の仕様は以下のようになっています!
購入画面の仕様は以下のようになっています!
↑自動販売機:購入画面

マイケル
上部の入金エリアでお金を投入し、
下部の飲み物をクリックすると購入する
という、自動販売機のシミュレータになります!
下部の飲み物をクリックすると購入する
という、自動販売機のシミュレータになります!

エレキベア
まんま自販機クマね

マイケル
メンテナンス画面作成の時にはjuiceテーブルのみ使用していましたが、
自動販売機ごとの金額管理を行う必要があるため、
新たにmachineテーブルも使用します。
自動販売機ごとの金額管理を行う必要があるため、
新たにmachineテーブルも使用します。

エレキベア
確かmachineテーブルとjuiceテーブルは
1:Nの関係だったクマね
1:Nの関係だったクマね

マイケル
よく覚えてたね!
自動販売機ごとに飲み物の種類や在庫を管理するから
下記の図のようになるよ!
自動販売機ごとに飲み物の種類や在庫を管理するから
下記の図のようになるよ!

マイケル
このような関係にすることで、
自動販売機ごとに分けて処理することができるんだ!
自動販売機ごとに分けて処理することができるんだ!
↑自動販売機内の飲み物の購入ができる

エレキベア
なるほどクマね〜〜
やったるクマよ〜〜〜〜!!
やったるクマよ〜〜〜〜!!

マイケル
それじゃ作っていこう!
購入画面の作成

マイケル
今回作成するのは下記の部分!
新たに作るmachineテーブルのモデルと、
「/buy」で実行する画面・処理の実装だ!
新たに作るmachineテーブルのモデルと、
「/buy」で実行する画面・処理の実装だ!

エレキベア
これで全体が完成するクマね

マイケル
もう少しの辛抱だ!
今回もMVCの順で見ていこう!
今回もMVCの順で見ていこう!
Model

マイケル
まずはModelの作成からだ!
juiceテーブルのモデルはもう作成しているから、
新たにmachineテーブルのモデルを作成しましょう!
juiceテーブルのモデルはもう作成しているから、
新たにmachineテーブルのモデルを作成しましょう!
↑machineテーブルのModelクラス

エレキベア
変数の部分は前も出てきたクマが、
新たに作っている juicesメソッド は何クマ??
新たに作っている juicesメソッド は何クマ??

マイケル
これは、machineテーブルに紐づくjuiceテーブルのレコードを取得するために
hasMany()メソッドを定義しているんだ!
hasMany()メソッドを定義しているんだ!

マイケル
これを定義して、View側で「juices」を指定することで、
machineテーブルの「id」と
juiceテーブルの「m_id(第2引数)」に紐づくレコードを全て取得できるんだよ。
machineテーブルの「id」と
juiceテーブルの「m_id(第2引数)」に紐づくレコードを全て取得できるんだよ。

エレキベア
それは便利クマね・・・。
自動販売機のレコードに紐づく飲み物一覧を取得するには持ってこいクマ
自動販売機のレコードに紐づく飲み物一覧を取得するには持ってこいクマ

マイケル
そういうことだね!
表示の方法はこの後のViewの実装でみていこう!
表示の方法はこの後のViewの実装でみていこう!
View

マイケル
購入画面を新たに作成するため、
下記Viewクラスを作成しましょう!
下記Viewクラスを作成しましょう!
■ juiceapp.blade.php
格納先:app/resources/views/layouts
格納先:app/resources/views/layouts
■ index.blade.php
格納先:app/resources/views/buy
格納先:app/resources/views/buy

マイケル
「juiceapp.blade.php」は前回作成しているからCSSの追加のみ!
メインとなる購入画面は「buy」フォルダの下に作成しましょう!
メインとなる購入画面は「buy」フォルダの下に作成しましょう!

マイケル
それでは各処理部分を見ていきます!

エレキベア
わくわくクマ〜〜〜〜〜
・入金処理の記述

マイケル
画面上部にある入金エリアはこんな感じだ!

マイケル
これも前回と同じく、一つのformでいくつかの処理で分けるので
submitボタンのnameを分けておきましょう!
submitボタンのnameを分けておきましょう!

エレキベア
お金の種類によって入金額を変えるクマね
・購入処理の記述

マイケル
そして購入部分はこちらになります!

マイケル
ここでMachineモデルの「hasMany()」で取得した結果を出力しているよ!
$machine->juices と書くことで、juices()メソッドの戻り値が出力されるんだ!
$machine->juices と書くことで、juices()メソッドの戻り値が出力されるんだ!

エレキベア
Modelの時の説明してたやつクマね
これだけで結合結果が出力できるのはすごいクマね
これだけで結合結果が出力できるのはすごいクマね

マイケル
それからBladeでは「@if」を使うことで判定条件も記述できるよ!
上の例では在庫(stock)が0の時にはボタンを非活性にしているんだ。
上の例では在庫(stock)が0の時にはボタンを非活性にしているんだ。

エレキベア
条件文が使えれば柔軟に表示処理を行えるクマね
Controller

マイケル
そして最後に、Controllerの記述はこんな感じだ!
・index()メソッド -> 初期表示
・buy()メソッド -> 購入処理
・maney()メソッド -> 入金処理
というように分けているよ!
・index()メソッド -> 初期表示
・buy()メソッド -> 購入処理
・maney()メソッド -> 入金処理
というように分けているよ!
・初期表示

マイケル
初期表示の処理は下記のように記述していて、
自動販売機IDに紐づくデータのみ取得しています!
自動販売機IDに紐づくデータのみ取得しています!
↑初期表示処理

マイケル
こう書くことで、
http://【サーバアドレス】/buy?id=【自動販売機ID】
でアクセスすればその自販機の一覧のみ取得できるんだ!
http://【サーバアドレス】/buy?id=【自動販売機ID】
でアクセスすればその自販機の一覧のみ取得できるんだ!

エレキベア
リクエストにパラメータを渡しているわけクマね
↑自動販売機IDに紐づく飲み物が表示される
・購入、入金処理

マイケル
購入処理は下記のように、
飲み物の価格の分だけお金を、在庫は1ずつ減らしています!
飲み物の価格の分だけお金を、在庫は1ずつ減らしています!
↑購入処理

エレキベア
減らす処理はどこでやってるクマ?

マイケル
decrement(【項目名】,【減らす数】)
のメソッドを使うことで減らすことができるんだ!
のメソッドを使うことで減らすことができるんだ!

エレキベア
メソッドが用意されていると楽ちんクマね

マイケル
そして入金処理は以下のとおり!
前回と同じくsubmitボタンの名前で分岐させています!
前回と同じくsubmitボタンの名前で分岐させています!
↑入金処理

マイケル
こっちは逆にincrement()メソッドで加算しているね。

エレキベア
簡潔にかけて綺麗クマ
・バリデーションの記述

マイケル
そして次にバリデーションです!
これも前回と同じくFormRequestクラスを作成して設定しましょう!
これも前回と同じくFormRequestクラスを作成して設定しましょう!

エレキベア
今回もrule()メソッドに少し
個別の処理を入れてるクマね
個別の処理を入れてるクマね

マイケル
その通り!
今回は複数項目の関連チェックを行うため、
下記チェックを追加しているよ!
今回は複数項目の関連チェックを行うため、
下記チェックを追加しているよ!

マイケル
このように記述すれば少し複雑なチェック処理も記述できるんだ!

エレキベア
オリジナルのチェック処理も入れ放題クマね
・Routeの設定

マイケル
それでは最後に記述したControllerを呼び出すため
Routeの設定をしましょう!
Routeの設定をしましょう!

マイケル
追加するのは下の三行!
今回は入金処理と購入処理を別のアクションにしているため、postを2つ記述しているよ!
今回は入金処理と購入処理を別のアクションにしているため、postを2つ記述しているよ!

マイケル
以上で自動販売機システムの完成だーーー!!

エレキベア
やったクマ〜〜〜〜!!!!
おわりに

マイケル
というわけで三回に渡る長編企画でしたが
いかがだったでしょうか??
いかがだったでしょうか??

エレキベア
早足だったクマが、一つのシステムを完成させて
自信がついたクマーー!!
自信がついたクマーー!!

マイケル
それはよかった!
今回作ったシステムは最低限動作するけど、
・排他処理の実装
・ユーザ管理や権限周りの実装
・ページングの実装
あたりは省略しているから、次のステップアップを目指す人は挑戦してみてね!
今回作ったシステムは最低限動作するけど、
・排他処理の実装
・ユーザ管理や権限周りの実装
・ページングの実装
あたりは省略しているから、次のステップアップを目指す人は挑戦してみてね!

エレキベア
まだまだシステム開発は先が長いクマね

マイケル
知れば知るほど奥が深いWEBアプリ開発!
興味を持った方はぜひ挑戦してみてね!
興味を持った方はぜひ挑戦してみてね!

エレキベア
クマ〜〜〜〜〜!!

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!
【Laravel】第三回 自動販売機システムを作ろう! 〜購入画面の作成〜 〜完〜