【Laravel】ホテル予約管理システム完成

もう少しで完成だから、もうちょっとやって終わろうと思ったら、ガッツリ書き換えることになるというプログラマーあるある。

やっぱり、チェックしたかどうかも管理するべきだろう(もはや仕様変更レベル)と思いました。

データベースに、「チェックしたかどうか」を格納するカラムを追加します。

マイグレーションファイルを作成し、マイグレートします。

class AddSubmit extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->boolean('lodging');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->dropColumn('lodging');
        });
    }
}

ちょっと名前がいろいろとアレだけど、あとから直すの面倒くさいので、そのまま使用する。(ちゃんと前もって設計しなさい、という話。)

予約一覧にチェックしたらポチるボタンを設置。

                    <table class="management">
                        <tr>
                            <th class="name">名前</th>
                            <th class="address">住所</th>
                            <th class="phone">電話番号</th>
                            <th class="num">人数</th>
                            <th class="date">宿泊日</th>
                            <th class="num">宿泊日数</th>
                            <th class="command">編集</th>
                            <th class="command">削除</th>
                            <th class="command">宿泊</th>
                        </tr>
                    @foreach ($registerLists as $list)
                        <tr>
                            <td class="name">{{ $list->name }}</td>
                            <td class="address">{{ $list->address }}</td>
                            <td class="phone">{{ $list->phone }}</td>
                            <td class="num">{{ $list->num }}</td>
                            <td class="date">{{ $list->start_day }}</td>
                            <td class="num">{{ $list->days }}</td>
                            <td class="command">{{ Html::link('/management/'.$list->id.'/edit', '編集') }}</td>
                            <td class="command">{{ Html::link('/management/'.$list->id.'/conform', '削除') }}</td>
                            <td class="command">
                            {!! Form::open(['url' => action('RegisterManagementController@lodging')]) !!}
                            {!! Form::hidden('id', $list->id) !!}
                            {!! Form::submit('宿泊') !!}
                            {!! Form::close() !!}
                            </td>
                        </tr>
                    @endforeach
                    </table>

ポチったらPOSTでid番号を受け取り、追加したカラムをtrueに変更して予約一覧へリダイレクト。

    /**
     * 宿泊処理確認
     *
     * @return \Illuminate\Http\Response
     */
    public function lodging(Request $request)
    {
        $this->registerManagement->lodging($request->id);
        return redirect('management');
    }
    /**
     * 宿泊処理を行う
     */
    public function lodging($id)
    {
        $model = $this->getItemById($id);
        $model->lodging = true;
        $model->save();
    }

スケジュール一覧にもチェックしたかどうかを表示します。

                    <table class="schedule">
                        <tr>
                            <th class="date">日時</th>
                            <th class="name">名前</th>
                            <th class="lodging">宿泊状況</th>
                        </tr>
                    @foreach ($Lists as $list)
                        <tr>
                            <td class="date">{{ $list['day'] }}</td>
                            <td class="name">{{ $list['name'] }}</td>
                            @if ($list['lodging'])
                                <td class="lodging">チェック</td>
                            @else
                                <td class="lodging">未チェック</td>
                            @endif
                        </tr>
                    @endforeach
                    </table>
    /**
     * スケジュール一覧を取得する
     */
    public function getSchedule()
    {
        $lists = array();
        $index = 0;
        $models = ReserveDayList::orderBy('day')
                                    ->get();
        foreach($models as $model)
        {
            $lists[$index] = array(
                                'day' => $model->day,
                                'name' => $model->reserveManagements()->first()->name,
                                'lodging' => $model->reserveManagements()->first()->lodging
                            );
            $index++;
        }
        return $lists;
    }

    /**
     * 月別スケジュール一覧を取得する
     */
    public function getScheduleByMonth($year, $month)
    {
        $lists = array();
        $index = 0;
        $models = ReserveDayList::where('day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->orderBy('day')
                                ->get();
        foreach($models as $model)
        {
            $lists[$index] = array(
                                'day' => $model->day,
                                'name' => $model->reserveManagements()->first()->name,
                                'lodging' => $model->reserveManagements()->first()->lodging
                                );
            $index++;
        }
        return $lists;
    }

集計も、チェック済みのものだけ集計対象にします。

テーブルを結合して、チェック済みの日数を数えます。

    /**
     * 月毎に集計する
     */
    public function countByMonthly()
    {
        return ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), DB::raw('count(*) * 2000 as total'))
                                ->leftJoin('reserve_day_list_reserve_management', 'reserve_day_lists.id', '=', 'reserve_day_list_reserve_management.reserve_day_list_id')
                                ->leftJoin('reserve_managements', 'reserve_day_list_reserve_management.reserve_management_id', '=', 'reserve_managements.id')
                                ->where('reserve_managements.lodging', true)
                                ->groupby('yearmonth')
                                ->get();
    }

leftJoinが記載が汚いかもしれないけど、これはLaravelであるがゆえの運命。仕方がない。

これで本当に完成。提出してきます。

最終ソースはこちら

https://github.com/takishita2nd/hotel-mng

バナークリックで応援よろしくおねがいします。

【Laravel】月毎に売上の集計を行う

前回までの状況はこちら

最新ソースはこちら

https://github.com/takishita2nd/hotel-mng

月毎に集計を行います。

このときのデータベースの操作が大変で・・・

    /**
     * 月毎に集計する
     */
    public function countByMonthly()
    {
        return ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), DB::raw('count(*) * 2000 as total'))
                                ->groupby('yearmonth')
                                ->get();
    }

リポジトリはこれでなんとかできました。

select文でdayカラムをYYYY-mmのフォーマットで出力(このカラム名をyearmonthとする)。

yearmonthごとにgroupByでグループ分けし、count(*)で集計を行います。

もっとうまい方法があるかもしれませんが、迷ったらDB::raw()を使ったほうがいいかもしれません。

でも、これができれば完成したも同然。

簡単すぎるので、コードは省略。

あとは最後の微調整で完成ですね。

バナークリックで応援よろしくお願いします。

【完全栄養食】BASE NOODLEの油そば

本日2食目の完全栄養食。

スープには不向きだが、タレを絡めて食べれば十分美味しい、ならば油そばでもいけるのか、と思いました。

まずは、どんぶりにゴマ油と、パックのラーメンソースを半分入れます。

その上に、茹でて水を十分に切ったBASE NOODLEを入れます。

後はお好みでトッピング。

かき混ぜて召し上がれ。

うん、いける!

一人前が、普通の麺の量より多いので、ラーメンソースは1パック全部入れてしまっても良かったかもしれない。

今日も美味しゅうございました。

バナークリックで応援よろしくお願いします。

【食材を知る】ニラを食べるメリット

鍋や炒め物にすると美味しいですよね。

疲労回復作用にバフ効果

ニラに多く含まれるアリシンによってビタミンB1の吸収を助け、疲労回復作用を助けてくれます。

血流を改善し冷え性予防

アリシンは血流を良くする働きがあり、ビタミンEには 不飽和脂肪酸の酸化を防ぐ作用があります。冷え性予防や血栓予防になります。

生活習慣病改善に

βカロテンは体内でビタミンAとなり、ガン予防に作用します。

老化防止

ビタミンCは活性酸素を減らし、老化を防止する作用があります。

【Laravel】月ごとにデータをフィルタさせる

前回までの状況はこちら。

最新ソースはこちら。

https://github.com/takishita2nd/hotel-mng

一通りデータの登録はできましたが、このままデータが増えると1画面に大量のデータが表示されることになります。

なので、一覧のデータを月毎にフィルタ表示させたいと思います。

まず、Viewを修正。

年月を指定できるようにします。

                    {!! Form::open(['url' => action('RegisterManagementController@indexToMonthly')]) !!}
                    <table>
                        <tr>
                            <td>{!! Form::selectYear('year', 2019, 2020) !!}年</td>
                            <td>{!! Form::selectMonth('month') !!}</td>
                            <td>{!! Form::submit('表示') !!}</td>
                        </tr>
                    </table>
                    {!! Form::close() !!}

本来は、Vue.jsなどを使ってフロントエンド側でうまくできるのが理想なのですが、今からVueの実装を行うのは面倒くさいので、フィルタ情報を一旦POSTで受け取り、GET+クエリパラメータの形にして、リダイレクトさせるという方法をとります。

ルートの設定。

Route::post('/management/indexToMonthly', 'RegisterManagementController@indexToMonthly');

コントローラ。まずはGETの方。

    /**
     * Show the Register.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        if(is_null($request->input('year')) || is_null($request->input('month')))
        {
            return view('register.index', ['registerLists' => $this->registerManagement->getList()]);
        }
        else
        {
            return view('register.index', ['registerLists' => $this->registerManagement->getListByMonth($request->input('year'), $request->input('month'))]);
        }
    }

GETリクエストでも引数にRequest $requestを書き足せば、クエリパラメータを取得できます。

忘れてはいけないのは、クエリパラメータがNULLだった場合。

is_null()でNULLチェックを行い、デフォルト(パラメータがない場合)の画面表示をさせるようにしましょう。

次は、POST側の処理。

    /**
     * indexの月別表示
     *
     * @return \Illuminate\Http\Response
     */
    public function indexToMonthly(Request $request)
    {
        return redirect('management?year='.$request->year.'&month='.$request->month);
    }

クエリパラメータ付きURLを作成し、リダイレクトを行っています。

これしか方法が思い浮かばなかった。

次はリポジトリ。

    /**
     * 月別予約一覧を取得する
     * 
     * @return ReserveManagement[]
     */
    public function getListByMonth($year, $month)
    {
        return ReserveManagement::where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->get();
    }

whereを2つ付けることでAND条件になります。

クエリビルダー便利。

同じやり方をスケジュール一覧にも行います。

十分とは言えませんが、やりたいことはできました。

たぶん次でラスト。

月毎に売上を集計して表示させます。

バナークリックで応援よろしくおねがいします。

【完全栄養食】BASE NOODLEのボロネーゼソース

BASE NOODLEの箱を調べたら、こんな物が見つかりましたので、

いや、最初に確認しろよ。

きっと、お試しでおまけしておくから、気に入ったら買っておくれ、と言うことなのでしょう。

本日は完全栄養食の日(勝手に設定)なので、使ってみました。

きっと、BASE NOODLE用に合わせた味付けなのだろう。

見た目はトマトソース。

匂いもトマトソース。

味もトマトソース。

美味しく頂きました。

うん、市販のパスタソースで十分かな。

バナークリックで応援よろしくお願いします。

Xiaomiが日本進出、端末はMi Note10か?スペックを確認してみた。

中国のスマホメーカーXiaomiが日本進出を発表しました。

提供する端末は公開された写真からMi Note10ではないか、という予想がされています。

なぜなら、Xiaomiの3レンズカメラはこの機種だけだから。

ということで、スペックを見てみました。

これはすでにリリースされているグローバル版のスペックです。日本向けにカスタマイズされる可能性は十分あります。

CPUはミドルレンジのSnapdragon730G。

CPUはミドルレンジですが、メモリとストレージはハイエンド並み6GB/128GBですね。

指紋認証が前面パネルの中に内蔵されているようです。

大容量バッテリーを搭載しています。

防水・防塵ではありません。(だから安いのか)

珍しく赤外線を搭載しています。これで家電を操作できるみたいです。

グローバル版はおサイフケータイ搭載していませんが、日本向けにカスタマイズされるかもしれません。

ネットではすでにグローバル版をネットで購入しレビューを行っているので、参考にしてみてはいかがでしょうか?

バナークリックで応援よろしくお願いします。

【食材を知ろう】牛肉を食べるメリット・デメリット

食材を知れば、ダイエット中でも安心して食べることができます。

ここでは牛肉についてまとめてみました。

体を作るタンパク源

タンパク質は筋肉の元。筋トレと合わせれば基礎代謝がアップし、痩せやすくなります。

疲労に負けない体になる

牛肉に含まれている鉄分や亜鉛は血液を作る元となり、酸素を全身に送ってくれます。結果敵に疲れにくい体になります。

代謝を良くする

牛肉に含まれているビタミンB2は細胞の再生を活性化させ、エネルギーの消費を促進させます。結果敵にダイエットに繋がったり、美容効果もあります。

食べ過ぎに注意

牛肉の食べ過ぎは、脂質の取り過ぎとなり、血中コレステロールを増加させたり、中性脂肪をの数値を挙げることになります。

一日100g程度が理想とされています。食べ過ぎに注意しましょう。

バナークリックで応援よろしくお願いします。

【Laravel】スケジュールの重複をチェックする

前回まで状況はこちら。

最新ソースコードはこちら。

https://github.com/takishita2nd/hotel-mng

今回は予約を入れたスケジュールに重複がないかを確認し、重複していたらエラー表示を行います。

まず、重複チェックを行う処理をリポジトリに作成します。

    /**
     * スケジュールの重複を確認する
     * 
     * @return boolean
     */
    public function checkSchedule($date, $num)
    {
        if(ReserveDayList::where(['day' => $date])->count() != 0)
        {
            return false;
        }
        for($i = 1; $i < $num; $i++)
        {
            if(ReserveDayList::where(['day' => date('Y-m-d', strtotime($date.'+'.$i.' day'))])->count() != 0)
            {
                return false;
            }
        }

        return true;
    }

予約を入れる日にち全てに対して、データがあるかを確認します。

データの有無は、おそらく、count()でレコード数を見るのが一番スマートなやりかたでしょう。

これを、コントローラーから呼びます。

    /**
     * 登録処理
     */
    public function store(ManagementRequest $request)
    {
        if($this->registerManagement->checkSchedule($request->start_day, $request->days) == false)
        {
            return redirect('management/create')
                        ->with(['error' => 'スケジュールが重複します'])
                        ->withInput();
        }
        $param = $this->registerManagement->getParam();
        $this->registerManagement->add([
            $param[0] => $request->name,
            $param[1] => $request->address,
            $param[2] => $request->phone,
            $param[3] => $request->num,
            $param[4] => $request->days,
            $param[5] => $request->start_day
        ]);
        return redirect('management');
    }

重複していたら、元の画面にリダイレクトします。

このとき、セッションにエラーメッセージも一緒に入れます。

withInput()を入れると、入力したデータもそのまま残るようになります。

次はbladeにエラーを表示するエリアを作成します。

                @if (session('error'))
                    <div class="alert alert-danger">
                        {{ session('error') }}
                    </div>
                @endif

うまくできました。

もう少しでこの課題は完成ですね。

バナークリックで応援よろしくお願いします。

ぷろたんが語るダイエットの秘訣とは?

この動画を見て、びっくりしましたね。

久しぶりのぷろたんの動画なのですが、以前より遙かに痩せているのです。

顔を見れば全然違います。

この動画の中でぷろたんが語っていた痩せるためにやったこと、というのが、

その食材を食べると、どのような効果があるのかを知ること。

例えば、我々が一般的に「これを食べれば痩せる」などの話が沢山ありますが、その食材を食べることで、どのようにして痩せるのか、というのは意外と知らないものです。

しかし、食材のことを調べればどのような栄養素を含んでいて、それを摂取することによってどのような効果があるのか、と言うのがわかります。

そういうのを徹底的に調べたらしいです。

食を知ること。

ダイエットは運動と食事と言われていますが、食の部分はこれが一番重要なのかもしれません。

よし、オイラも食の勉強をする。

調べたことをこのブログでも載せたい。

がんばります。

バナークリックで応援よろしくお願いします。

自分、ぼっちですが何か?