Let's start from here

データベースとの連携(5)CRUD

データベース連携の最後のまとめとしてCRUDを実装した簡単なWebシステムを実装します。
「CRUD」とは、「Create」レコードの作成、「Read」レコード読み込み、「Update」レコードの更新、「Delete」レコードの削除機能を作成します。
ルーティング、コントローラー、モデル、ビューの各役割りと連携、データのライフサイクルを確認しながら学んでいきましょう。

CRUDの仕様

◆実装機能

①会員登録
会員情報を登録する機能

②一覧画面
全会員情報をデータベースから取得して会員一覧を画面出力

③会員情報更新
登録済み会員情報を入力フォームに表示して内容の修正更新が出来る

④会員情報の削除
登録した会員情報を削除できる

データベースのテーブル仕様

新規データベース「crud」を作成

id(登録番号)を「主キー」にして全項目入力必須とします(Not Null)

フィールド名 データ型 備考
id integer 登録番号(自動採番)
name varchae(64) 氏名
age tinyinteger 年齢
mail varchae(256) メールアドレス
created_at datetime 登録日時
updated_at datetime 更新日時
画面レイアウト

画像1:初期アクセス画面(一覧)

画像2:新規入力フォーム

画像2:編集入力フォーム

環境準備

CRUDプロジェクトの作成
≪Larvel プロジェクトの導入はこちら≫

マイグレーションファイルの作成

先に作成したデータベースのテーブル仕様に従ってマイグレーションファイルを作成しましょう。
今回は、membersテーブルなので、

作成したマイグレーションファイルを編集

マイグレーションの実行

≪マイグレーションの詳しい説明こちら≫

Larvelプロジェクトの環境設定ファイル「.env」に追記

≪データベースへの接続設定≫

コントローラファイルの作成

app/Http/Controllers/MemberController.php

モデルファイルの作成

app/Http/Models/Member.php

登録プログラムの作成【Create】

ルーティングの設定

routes/web.php に以下の記述を追加

一覧画面を表示する為のルーティング

このルーティングでは、Memberコントローラのindexメソッドを呼び出している

≪ルーティングの詳しい説明こちら≫

コントローラにindexメソッドの作成

初期アクセス画面を表示するためメソッドを作成
(先のルーティングから呼び出されている)

初期画面レイアウトファイルを作成

resources/views/index.blade.php
index.blade.phpソース内の新規登録のアンカーリンクに“/member/form”を指定する。

ルーティングの追加

新規登録のリンクをクリックした場合のリクエスト対応として、
routes/web.phpにルーティングを追記

MemberControllerにformメソッドを追加

ルーティングからのメソッド呼び出しを受けれるようにする

このメソッドは、bladeファイルを呼び出している

新規登録用のレイアウトファイルを作成

新規登録ボタンを押された時にメソッドから呼び出されるbladeファイル
resources/views/form.blade.php

入力フォームのソース

formリクエストは、POST送信で送信先は「store」にする。

入力フォームからPOST送信する際は「@scrf」の記述がないとエラーになります。
CSRF(クロスサイトリクエストフォージェリ)はWebシステムを悪用したサイバー攻撃でこの1行はこれを防ぐ対策です。

送信ボタンを押した場合のURLに対応するルーティングを追加

routes/web.phpにルーティングを追記

(このルーティングは、POSTリクエストを受け取るのでpostメソッドを使っている)

ここでは、MemberControllerのstoreメソッドを呼び出している

MemberControllerにデータベース登録用のstoreメソッドを追加

このコントローラには、クエリを記述するのでファイルの冒頭でモデルの読み込みを追加しておく
(これがないとMemberモデルに対するクエリを実行できない)

app/http/controllers/MemberContoroller

このメソッドは、リクエストパラメータを受け取れるようにメソッドの引数にリクエスト変数を入れておきます(依存性の注入【DI】については別の学習であらためて説明します)。
メソッド内でユーザーから送信されたリクエストの値を扱えるようになります。

ここでは、createメソッドを使ってデータベースに登録しています。
引数に連想配列を指定して、「key」にデータベースのフィールド名、「value」に登録する値を指定します。

≪クエリメソッド「Create」の詳しい説明こちら≫

登録が完了すると初期画面に戻るようにリダイレクト処理を最後に記述しています。

Memberモデルに登録

モデルを介してデータの登録・更新をする場合は、$fillableプロパティを設定して対象のフィールドを配列として加える必要があります。

ブラウザでの登録操作と登録データの確認

Laravelの起動

http://127.0.0.1:8000/member

データを登録しよう
データベースのmembersテーブルを確認するとデータが登録されているあずです。
(データベースクライアントを使って確認してください)

登録レコードの読込【Read】

データの登録処理は、完成したのでレコードを表示できるようにしましょう。

コントローラのindexメソッドを編集

一覧出力をするためにindexメソッドにデータ取得のクエリを追記する
クエリの取得データをview関数の第2引数に設定
これにより呼び出されたbladeファイル(index.blade.php)で結果の値を扱える

初期画面用のレイアウトファイルを編集(blade)

index.blade.php

≪bladeの変数出力やディレクティブの詳しい説明こちら≫

ブラウザで出力確認

Laravelの起動

http://127.0.0.1:8000/member

登録データが初期画面に表示されています。
追加で登録処理を行うと即座に反映されます。

登録レコードの更新【uodate】

登録済みデータの編集を実装しましょう。
編集は一覧出力のレコードの氏名にアンカーリンク設定し、クリックしたら編集画面が開くようにしましょう。

一覧出力の氏名にアンカータグで囲む(blade)

index.blade,php(部分抜粋)

この氏名の出力ソースを修正します。

修正後のソースのアンカーリンクの遷移先は、「/member/edit/登録番号」

編集の際、レコードを特定する必要があるのでアドレスに登録番号を含めています

編集画面表示用のルーティングを追加

ルーティングの第1引数のURL部分に“{ルートパラメータ}”を記述すると呼び出したコントローラのメソッド側でリクエストパラメータとして取得できるようになります。今回は、パラメータ名を「id」としているので、コントローラのメソッド(edit)で、$request->id で取得できます。

コントローラにeditメソッドを追加

データベースのmemberテーブルからアンカータグでクリックされた登録番号のレコード情報を1件取得して編集用入力フォームに取得データを渡す。

レコード編集用のフォームレイアウトを作成(blade)

先に作成したform.blade,php をコピーしてedit.blade.phpを作成する

変更箇所
①登録番号の表示
②送信アドレスの変更 action=”/member/update”
③inputコントロールにvalue属性を追加してデータベースから取得した登録データをセットする。
④このレコードの登録番号も送信データに含めるためinputコントロールのtype属性をhiddenにしたコントロールを追加する。

resources/views/edit.blade.php

form.blade.phpを使って共通利用もできますが、ソースが複雑になるので別ファイルを作成してシンプルな表記にしています。

編集データの更新用ルーティングを追加

編集フォームのaction属性に対応した以下のルーティングを追記

MemberControkkerのupdateメソッドを呼び出す

コントローラにレコードの更新処理をするupdateメソッドを追加

findメソッドで特定したレコードに対してupdateメソッドを実行しています。

更新後は、初期画面の一覧に遷移します。
データが正しく更新されているか確認してください。

登録レコードの削除【Delete】

では最後に削除機能を実装しましょう。

レコード編集用のフォームレイアウトに追記(blade)

削除機能用のアンカーリンクを編集用のフォームに追加しましょう
追加する場所はformの閉じタグの下です(formタグ内に記述すると正常に動きません)。

resources/views/edit.blade.php

削除処理用のルーティングを追加

編集フォームの画面表示と同様にルートパラメータを設定します。

コントローラにdeleteメソッドを追加

データベースのmemberテーブルからアンカータグでクリックされた登録番号のレコード情報に対して削除処理を実行します。

削除処理実行後は、初期画面の一覧に遷移します。
レコードは、削除されているか確認してください。