【Laravel】テーブルの内容を更新する

前回までの様子はこちら。

ソースコードはこちら。

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

今回は登録した内容を更新するところまでやります。

データを更新する前に、データを更新するページにリンクするように一覧画面を修正します。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">予約一覧</div>

                <div class="panel-body">
                    <table>
                        <tr>
                            <th>名前</th>
                            <th>住所</th>
                            <th>電話番号</th>
                            <th>人数</th>
                            <th>宿泊日</th>
                            <th>宿泊日数</th>
                            <th>編集</th>
                            <th>削除</th>
                        </tr>
                    @foreach ($registerLists as $list)
                        <tr>
                            <td>{{ $list->name }}</td>
                            <td>{{ $list->address }}</td>
                            <td>{{ $list->phone }}</td>
                            <td>{{ $list->num }}</td>
                            <td>{{ $list->days }}</td>
                            <td>{{ $list->start_day }}</td>
                            <td>{{ Html::link('/management/'.$list->id.'/edit', '編集') }}</td>
                            <td>削除</td>
                        </tr>
                    @endforeach
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

そして、ルーティングの設定も追加します。

Route::get('/management/{id}/edit', 'RegisterManagementController@edit');
Route::post('/management/update', 'RegisterManagementController@update');

更新フォームへのリンクと、実際にデータを更新するリクエストですね。

コントローラーには、以下の関数を追加します。

    /**
     * 編集処理
     */
    public function edit($id)
    {
        return view('register.edit', ['item' => $this->registerManagement->getItemById($id)]);
    }

    /**
     * 更新処理
     */
    public function update(Request $request)
    {
        $param = $this->registerManagement->getParam();
        $this->registerManagement->updateById($request->id,
        [
            $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');
    }

そして、リポジトリには以下の関数を追加。

    // IDから予約を1件取得する
    public function getItemById($id)
    {
        return ReserveManagement::where(['id' => $id])->first();
    }

    // 予約を更新する
    public function updateById($id, $param)
    {
        $model = $this->getItemById($id);
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->save();
    }

「編集」のリンクのURLにデータベースのID番号が入っていて、それをコントローラーで受け取り、データベースからIDで参照して、データを取得します。

そして、取得したデータをViewに渡します。

実際に編集画面のViewはこちら。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">予約登録</div>

                <div class="panel-body">
                {!! Form::open(['url' => action('RegisterManagementController@update')]) !!}
                {!! Form::hidden('id', $item->id) !!}
                <table>
                    <tr>
                        <td>名前</td>
                        <td>{!! Form::text('name', $item->name) !!}</td>
                    </tr>
                    <tr>
                        <td>住所</td>
                        <td>{!! Form::text('address', $item->address) !!}</td>
                    </tr>
                    <tr>
                        <td>電話番号</td>
                        <td>{!! Form::number('phone', $item->phone) !!}</td>
                    </tr>
                    <tr>
                        <td>人数</td>
                        <td>{!! Form::select('num', ['1' => 1, '2' => 2], $item->num) !!}</td>
                    </tr>
                    <tr>
                        <td>宿泊日数</td>
                        <td>{!! Form::select('days', ['1' => 1, '2' => 2, '3' => 3, '4' => 4], $item->days) !!}</td>
                    </tr>
                    <tr>
                        <td>宿泊日</td>
                        <td>{!! Form::date('start_day', $item->start_day) !!}</td>
                    </tr>
                </table>
                {!! Form::submit('登録') !!}
                {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

見た目は登録と同じですが、デフォルト値を設定しているのが異なります。

コントローラーから受け取った値をデフォルト値として設定しています。

そして、登録ボタンを押すと、その情報がコントローラーのupdate関数に渡されます。

そして、その情報をデータベースに設定し、一覧画面にリダイレクトします。

これで更新処理が完成しました。

次回は削除処理を作りたいと思います。

↑よかったらクリックお願いします。

メモリについて語りたい。

情報処理の資格を目指して勉強している人にとっては当たり前の話なんですがね。

パソコンの記憶領域には3種類ありまして。

  • レジスタ
  • メモリ
  • ストレージ

と言う具合に分類されます。

三つの記憶領域

レジスタは、CPUが直接扱うことができるデータの領域、

メモリは、そのCPUの計算結果の一時退避場所です。

これらは、電源をOFFにすると全て消えてしまいます。

なので、消えてしまうとマズいデータは全てストレージの領域に待避させます。

ストレージは、我々で言う、HDDとか、SSDと呼ばれる領域です。

それぞれのアクセススピード

各記憶領域のアクセススピードは、

レジスタ≫メモリ≫ストレージ

「≫」というのは、天地ほどの差があると言うことです。

メモリが少ないとPCの処理が遅くなる理由

パソコンはたくさんのアプリを起動すると、それだけ、沢山のメモリを使用します。

もし、このとき、必要なメモリのサイズを用意できなかったら。

OSは一番使用していないメモリの中のデータをストレージにコピーして、メモリの容量を確保します。

そして、必要になったとき、待避したストレージ上のデータをメモリに戻すという処理が発生します。

これは、情報処理の勉強をしている人ならわかるかもしれませんが、スワッピング(または、ページング)と呼ばれる処理です。

メモリが少ないとこの一連の処理が頻発します。

これが、パソコンの処理を重くしている一番の要因です。

なぜなら、通常のメモリアクセスより、ストレージにアクセスする方が遙かに遅いためです。

用途によって区別しよう

ここで、私が提案するのは、使用する用途によってわかりやすいように区別しようと言うことです。

例えば、

  • 4GB→参照するだけ
  • 8GB→一般の使用
  • 16GB→プログラマー向け
  • それ以上→クリエイター向け

4GBというのは、主にスティック型PCに搭載される最低ラインのメモリサイズです。

これくらいならば、リモートデスクトップで開発用PCの画面を表示するだけならば、十分なスペックです。

というか、複数の画面を表示させようとするならば、それだけPCの処理が重くなります。十分なメモリサイズとは言えません。

しかし、8GBならば、ある程度のウインドウを開いても十分耐えられるでしょう。

文章作成に2画面使用する程度ならば、十分耐えられると言えます。

しかし、最近のインターネットブラウザは複数タブで使用される事が多いです。

このタブをたくさん開けば、それだけ、メモリが消費されることになります。

プログラマーならば、連絡用途と調べ物用途にたくさんのタブやウィンドウを開くことになりますので、それだけたくさんのメモリが必要になります。

でも、クリエイターレベルになるとそれだけでも足りません。

なぜなら、扱うデータファイルのサイズが大きいから。

複数の大規模な動画データを扱うならば、16GBでギリギリ、もしくは、それ以上のメモリが必要になるでしょう。

ちなみに、今のMAC Proだと、最大メモリは768GB。

最前線のYouTuber達はこのスペックで動画編集していると思って問題無いと思います。

理想は8GB~16GB

今のPCのスペックでは、CPU自体の処理速度よりは、ストレージへのアクセス自体がボトルネック(一番処理が遅延している要因)と思いますので、

PCの処理が重いと感じ、様々な手を施しても改善しない場合は、メモリの増設とか、HDDをSSDに換装する、などの手を検討した方が良いかもしれません。

最近のホームページも重くなってきたし。

ちなみに、自分の場合

自分がPCを選ぶ場合は、まず最初にメモリのサイズを確認します。

ぶっちゃけ、CPUは世代や型番の違いによって、劇的に変化するわけではありません。

ストレージのサイズは後で外部HDD購入で増設できます。

あくまでも一番の遅延要因は、メモリ不足によるページング処理による遅延と言うことです。

なので、他のスペックよりも、何よりもメモリサイズを優先させます。

いかがだったでしょうか?

まぁ、これらは私の考えなので。

これからパソコンを購入したいと考えている人の参考になってもらえれば幸いです。

↑よかったらクリックおねがいします。

【Laravel】フォームからデータベースに登録する

最新ソースはこちら

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

前回からの続きです。

今回はデータベースに登録するフォームを作成し、そこから実際にデータを登録するところまで作成します。

まずは、登録フォームの作成から。

フォームを作るには、ヘルパーを使うのがいいです。

$ composer require "laravelcollective/html":"^5.4.0"

これでフォームのヘルパーが使えます。

Viewはこんな感じで作成しました。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">予約登録</div>

                <div class="panel-body">
                {!! Form::open(['url' => action('RegisterManagementController@store')]) !!}
                <table>
                    <tr>
                        <td>名前</td>
                        <td>{!! Form::text('name') !!}</td>
                    </tr>
                    <tr>
                        <td>住所</td>
                        <td>{!! Form::text('address') !!}</td>
                    </tr>
                    <tr>
                        <td>電話番号</td>
                        <td>{!! Form::number('phone') !!}</td>
                    </tr>
                    <tr>
                        <td>人数</td>
                        <td>{!! Form::select('num', ['1' => 1, '2' => 2]) !!}</td>
                    </tr>
                    <tr>
                        <td>宿泊日数</td>
                        <td>{!! Form::select('days', ['1' => 1, '2' => 2, '3' => 3, '4' => 4]) !!}</td>
                    </tr>
                    <tr>
                        <td>宿泊日</td>
                        <td>{!! Form::date('start_day', \Carbon\Carbon::now()) !!}</td>
                    </tr>
                </table>
                {!! Form::submit('登録') !!}
                {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Form::open()〜Form::close()までがフォームの部分です。

この間にいろいろ入力コントロールを入れます。

こんな感じで表示されます。便利。

登録ボタンを押したときの処理も追加します。

ルーティングの設定。

Route::get('/management/create', 'RegisterManagementController@create');
Route::post('/management', 'RegisterManagementController@store');

コントローラーの設定。

    /**
     * 入力フォーム
     */
    public function create()
    {
        return view('register.create');
    }

    /**
     * 登録処理
     */
    public function store(Request $request)
    {
        $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');
    }

$requestの中に、フォームに入力したデータが入ってます。

リポジトリからモデルに設定するパラメータを取得し、これらを連想配列に設定して、リポジトリに渡します。

その後、リダイレクトを行います。

次にリポジトリの設定。

    private $paramNames = ['name', 'address', 'phone', 'num', 'days', 'start_day'];

    // 予約を登録する
    public function add($param)
    {
        $model = new ReserveManagement;
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->save();
    }

    public function getParam()
    {
        return $this->paramNames;
    }

パラメータ名を配列で持たせることによって、foreachで回せるし、コントローラーとの意識のズレも防ぐことができます。

もっとうまい方法があるかもしれないけど、これが精一杯じゃ。

これで、登録処理が動くようになりました。

↑よかったらクリックお願いします。

【閉店】【ぼっち】本格焼肉カルビ大将

週に一度の焼き肉の日。

南平岸にある本格焼肉カルビ大将

ランチ営業をやっていて、しかもお昼からお酒が飲めるのです。

しかも食べ放題(90分)&飲み放題(100分)。

ランチは比較的お手頃ですが、選べるお肉の種類は少ないです。

牛カルビと豚カルビだけ。

でも、タレが沢山あり、付け合わせや、薬味なども沢山あるので、いろんな味が楽しめます。

お会計は税込み3817円でした。

他にもお肉の種類が異なる食べ放題プランがあります。

我が家からはちょっと遠いですが、気分転換には良いのではないでしょうか。

↑よかったらクリックお願いします。

【Linux】【Laravel】コントローラーからデータベースにアクセスする。

今回はLaravelでコントローラーからモデルを介してデータベースにアクセスするところまでを作ります。

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

まずは、モデルにアクセスして、アレコレするクラスを作成します。

ここでは、repositoryとしていますが、特に名前に決まりはありません。

<?php

namespace App\Repository;

use App\Model\ReserveManagement;

class RegisterManagementRepository
{
    // 予約一覧を取得する
    public function getList()
    {
        return ReserveManagement::all();
    }
}

今回はリスト取得だけの機能だけ実装します。

これをコントローラーで使用します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repository\RegisterManagementRepository;

class RegisterManagementController extends Controller
{
    protected $registerManagement;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->registerManagement = new RegisterManagementRepository();
    }

    /**
     * Show the Register.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('register.index', ['registerLists' => $this->registerManagement->getList()]);
    }
}

Laravelにはサービスコンテナという機能があるようですが、今回はシンプルにコントローラーのコンストラクタでrepositoryをインスタンス化します。

Viewはシンプルに名前を一覧表示するだけです。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">予約一覧</div>

                <div class="panel-body">
                    <table>
                    @foreach ($registerLists as $list)
                        <tr>
                            <td>これは {{ $list->name }} ユーザーです。</td>
                        </tr>
                    @endforeach
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

最後にルーティングを追加します。

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Route::get('/management', 'RegisterManagementController@index');

これで、ログイン状態で

http://localhost:8000/management

にアクセスすると、こんな感じで表示されました。

これでモデル・コントローラー・ビュー間のやり取りができるようになりました。

次は、CURD機能を一通り作成してみようと思います。

【完全栄養食】BASE NOODLEを食す。

届きました。

BASE NOODLE!

サブスクリプションで注文して、初回12食分50%オフの2840円でございます。

これ1食で一日に必要な栄養素(炭水化物とナトリウムを除く)を摂取することができます。

つまり、3食食べれば糖質オフの食事になります。

ダイエットにオススメ。

さて、これをどうやって食べようか、と考えたのですが、まずは、ヌードルだからラーメンでしょ、ということで、

ラーメンでございます。

見た目は完全に蕎麦。

しかし、これは失敗でした。

ヌードル本体に味がしっかりついているので、スープが完全にその味に負けてます。

あまり合いません。

スープよりは、例えば、焼きそばやパスタのソースに合うかもしれません。

ということで、2食目はこうしました。

BASE NOODLEの肉味噌あえ

これくらいの味付けで十分なんですよ。

BASE NOODLE自体に味がしっかり付いてますからね。

そして、3食目。

BASE NOODLEのラーメンサラダ

ドレッシングは冷蔵庫に眠っていたおろししゃぶしゃぶのタレを使いました。

これでも十分美味しいです。

マヨネーズとか、普通のサラダドレッシングでも美味しいかも。

しかし、ラーメンサラダ考えた北海道民、天才だな。

あと、一食分が結構量あるので、かなり腹持ちは良いです。

来週から水曜日は完全栄養食生活にしたいと思います。

なぜなら、木曜日は焼き肉の日だから。

【Linux】【Laravel】テーブル作成とリレーション

最新ソースはこちら

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

TechCommitの課題で、予約管理を行うツールを作成すえうということで、Laravelで作成してみようと思いまして。

まずはデータベースの作成から着手。

イメージはこんな感じ。

使用する部屋は1つという条件があるので、そんなに複雑にしなくてもいい。

だが、予約が空いている日、埋まっている日が簡単にわかるように、予約が入っている日を管理できるテーブルも追加する。

Laravelでデータベースを作成するマイグレーションファイルを作成する。

$ php artisan make:migration create_reserve_management

中身はこんな感じ。

<?php

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

class CreateReserveManagement extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('reserve_managements', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('address');
            $table->string('phone');
            $table->integer('days');
            $table->date('start_day');
            $table->timestamps();
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });

        Schema::create('reserve_day_lists', function (Blueprint $table) {
            $table->increments('id');
            $table->date('day');
            $table->timestamps();
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });

        Schema::create('reserve_day_lists_reserve_managements', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('reserve_managements_id')
                  ->foreign('reserve_managements_id')
                  ->references('id')->on('reserve_managements')
                  ->onDelete('cascade');
            $table->integer('reserve_day_lists_id')
                  ->foreign('reserve_day_lists_id')
                  ->references('id')->on('reserve_day_lists')
                  ->onDelete('cascade');
            $table->timestamps();
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('reserve_day_lists_reserve_managements');
        Schema::dropIfExists('reserve_day_lists');
        Schema::dropIfExists('reserve_managements');
    }
}

あとで微調整はする。

コメント無くてすまぬ。

これらは色々試行錯誤した結果なので、あとで直すかもしれない。

最新のコードはgitを参照していただきたい。

Schema::create()を使って、3つのテーブルを作成している。

1つめが予約管理、その次が予約日管理、最後に中間テーブル。

中間テーブルからは各管理テーブルを紐付けるように外部参照キーを設定している。

で、このテーブルを扱うために、モデルを作成する。

$ php artisan make:model reserve_management

これでモデルのベースが作成される。

整理のためにディレクトリは移動しているが、一個作ればそれをベースにして複製すればよい。

各管理テーブルからは以下のような関数を追加する。

    public function hasDayListAndManagement()
    {
        return $this->belongsTo('App\Model\reserve_day_lists_reserve_managements', 'id', 'reserve_managements_id');
    }

これで、管理テーブルから中間テーブルをリレーションすることができる。

逆に、中間テーブルから管理テーブルには、

    public function hasManagement()
    {
        return $this->hasMany('App\Model\reserve_management', 'id', 'reserve_managements_id');
    }

    public function hasDayList()
    {
        return $this->hasMany('App\Model\reserve_day_list', 'id', 'reserve_day_lists_id');
    }

と、すれば、参照できるようになる。

試しに、以下のコマンドを実行する。

$ php artisan tinker

$test = App\Model\reserve_day_list::first()
       => App\Model\reserve_day_list {#2912
            id: 1,
            day: "2019-10-10",
            created_at: "2019-11-20 00:52:20",
            updated_at: "2019-11-20 00:52:20",
          }
$test2 = $test->hasDayListAndManagement()
       => Illuminate\Database\Eloquent\Relations\BelongsTo {#2904}
$test2->get()
       => Illuminate\Database\Eloquent\Collection {#2897
            all: [
              App\Model\reserve_day_lists_reserve_managements {#2911
                id: 1,
                reserve_managements_id: 1,
                reserve_day_lists_id: 1,
                created_at: "2019-11-20 00:52:56",
                updated_at: "2019-11-20 00:52:56",
              },
            ],
          }
$test2->first()->hasManagement()->get()
       => Illuminate\Database\Eloquent\Collection {#2923
            all: [
              App\Model\reserve_management {#2915
                id: 1,
                name: "aaa",
                address: "bbb",
                phone: "ccc",
                days: 2,
                start_day: "2019-10-10",
                created_at: "2019-11-20 00:51:46",
                updated_at: "2019-11-20 00:51:46",
              },
            ],
          }

これで、予約日管理テーブルから予約管理テーブルを参照することができた。

逆に、予約管理テーブルから予約日管理テーブルを参照する。

$test = App\Model\reserve_management::first()
       => App\Model\reserve_management {#2912
            id: 1,
            name: "aaa",
            address: "bbb",
            phone: "ccc",
            days: 2,
            start_day: "2019-10-10",
            created_at: "2019-11-20 00:51:46",
            updated_at: "2019-11-20 00:51:46",
          }
$test2 = $test->hasDayListAndManagement()
       => Illuminate\Database\Eloquent\Relations\BelongsTo {#2904}
$test2->first()->hasDayList()->get()
       => Illuminate\Database\Eloquent\Collection {#2899
            all: [
              App\Model\reserve_day_list {#2911
                id: 1,
                day: "2019-10-10",
                created_at: "2019-11-20 00:52:20",
                updated_at: "2019-11-20 00:52:20",
              },
            ],
          }

できました。

Laravelはこれら、データベースへのアクセスが簡単だからいいよね。

家電家具もサブスクできる時代

subsclife

https://subsclife.com

様々な家具・家電を月額でレンタルできます。

レンタル期間が終了した場合はその商品を購入することもでき、様々な家具家電を試し置きしてみる、といった利用方法ができます。

いいなぁ。

利用にはクレジットカード必須です。

デビットカードやプリベイトカードでは利用できません。

いいなぁ。

Rentio

https://www.rentio.jp

家電メインですが、特にカメラ関連のアイテムが多い印象です。

イベントの時に必要になった!と言うときに活躍してくれるかもしれません。

いいなぁ。

【自作PC】配線問題はこれで終わりにしよう。

前回の配線汚い問題。

まずはCPU電源が短すぎるので、これを買いました。

CPU電源の延長ケーブル。

これで、マザーボードの裏側を通すことができます。

さらに、これも買いました。

マジックテープの結束バンド。

マジックテープだから、何度でも取り付け・取り外しができるんです。

これは便利。

こんな感じでファンの電源とまとめました。

使っていないPCI-Expressの電源もまとめてしまっておきます。

どうです。だいぶスッキリしたでしょう。

PCケースがアクリルで中身がスケスケになっているモデルなので、これでやっと人様に見せられるレベルかと。

【自作PC】いろんなベンチマークソフトを動かしてみる。

前回までに、FF14でのベンチマークの計測結果を載せましたが、世の中には様々なゲームがそれぞれベンチマークソフトを提供していて、ゲーム毎に動作できるかどうかを確認できます。

まぁ、ゲーム毎に必要とされているスペックが違うと言うわけですね。

重たいゲームもあれば、軽いゲームもあるということです。

ということで、いくつかゲームをピックアップして、ベンチマークソフトを動かしてみました。

ちなみに、前回FF14のベンチマーク結果はこちら。

FF15ベンチマーク

紹介ページでの説明では、おそらく最もスペックを必要とするゲームらしい。

少なくともハイスペックのグラボを組み込まないと無理って言うことですね。

PSO2ベンチマーク

DQ10ベンチマーク

たぶん、FF15>FF14>PSO2>DQ10で重たいゲームになっているようです。

後々、グラボを増設してその前後で結果がどうなるか見て見たいので、これはとりあえず参考値ということで。

・・・DQ10やってみようかな。

暇だし。