Laravel – データモデル操作

概要

Laravelにおけるデータモデルの操作をまとめる。

例としてStickyNoteというアプリケーションを仮定する。StickyNoteは付箋紙のようなアプリケーションで、タイトルとメモ本文を扱う。このアプリケーションを通して、フォーム入力、データの読み込み、書き込み、更新、削除の流れをそれぞれ整理。

データ構造

マイグレーションファイル

マイグレーションファイルにより、StickyNotesの個々の付箋メモのデータ構造を定義。タイトル(title)とメモ本文(body)を定義している。

データベース

マイグレーションの結果得られるテーブルの構造。

データの読み込み

ルーティング

ドメイン名/sticky_noteのURL指定に対してコントローラーStickyNoteControllerindexアクションを呼び出す。

routes/web.php

コントローラーでの処理~all()による全データ取得

全データ取得はコントローラーのスタティックメソッドall()を使い、結果はレコード単位の配列で得られる。

ここでは、

  • indexアクションで$sticky_notesに表示対象の全データを取得
  • 取得した配列をビューに渡して遷移

app/Https/Controllers/StickyNoteController.php

ビューによる表示

ビューで受け取った配列をループで表示させている。データベースのカラムに対応した属性で、各カラムのデータが得られる。

resources/views/sticky_note/index.blade.html

データの書き込み

フォームでの入力と送信

書き込むデータをフォーム入力し、POTSTで送信する。

resources/views/create.blade.php

ルーティング~POSTに対する書き込み処理

POSTのルーティング先をコントローラーのstore()アクションとしている。

routes/web.php

コントローラーでの処理~create()によるデータ書き込み

ルーティング先のアクションではフォームリクエストを引数にとり、マスアサインメントと登録処理を1行で記述している。

また、アクションで引用するモデルとフォームリクエストのクラスをuseでインポートしている。

ここでは、

  • コントローラーの冒頭で、モデルStickyNoteとフォームリクエストStickyNoteRequestuseでインポート
  • フォームリクエストStickyNoteRequestを引数にとっている
  • リクエストのonly()メソッドでマスアサイン
  • アサイン結果をモデルStickyNotecreate()スタティックメソッドの引数に与え、データを登録
  • トップページにリダイレクト

app/Https/Controllers/StickyNoteController.php

モデルでの$fillable定義

コントローラーでのマスアサインメントを有効にするため、データモデルで$fillableプロパティーを定義。

ここでは、StickyNoteモデルクラスで$fillablepublic宣言して、読み込むプロパティーをtitlebodyの2つに限定している。

app/StickyNote.php

データの更新

ルーティング

  • 更新対象を指定するデータのidがルートパラメーターで指定されてGETされることを想定
    • URLにルートパラメーター{id}を含めている
    • GETメソッドでトップページなど他のページを区別するために、URLに/editを付けている
  • GETを受け取ったらeditアクションにルーティング
  • たとえばアンカータグでここに飛ばしたい場合は、url()ヘルパーを使って以下のように指定する
    • <a href="{{ url('/diaries') . '/' . $diary->id . '/edit' }}">

routes/web.php

コントローラーでの処理~find()による更新対象の取得

  • ルーティングで設定されたルートパラメーターは、アクションの引数で参照する
  • モデルのfind()スタティックメソッドで、idに対応するモデルのインスタンスを取得
  • 取得したモデルインスタンスを、更新用のフォームを持つビューに渡す
    • 遷移先のビューでidに対応するデータを初期表示するため

app/Https/Controllers/StickyNoteController.php

フォームでの入力と送信

  • 更新用のフォームを表示する
  • フォームの各要素に、受け取ったデータのタイトルと本文を初期表示する
  • 更新結果はPATCHメソッドで送信
    • HTTPにはGETとPOSTしかないので、formタグではPOSTを指定し、@method()ディレクティブでPATCHを指定している
    • 送信先のactionで、idをルートパラメーターとして付加している

resources/views/edit.blade.php

ルーティング

PATCHメソッドによるルートパラメーターidを含むURLへの送信を、update()アクションにルーティング。

routes/web.php

コントローラーでの処理~update()による更新処理

データの書き込みと同じような手順。

  • ルートパラメーターを引数で受け取り
    • 引数の順番は、フォームリクエスト、ルートパラメーターの順番
  • find()の引数にidを与えてデータを取得
  • マスアサインメントでデータを更新
  • トップページへリダイレクト

app/Https/Controllers/StickyNoteController.php

データの削除

ビュー~削除対象指定

  • 全データを表示する際に、各データをフォームで表示し、データごとに削除ボタンを置く
  • 削除ボタンが押されると、DELETEメソッドでidをルートパラメーターに含むURLを呼び出す
  • HTTPにはGETとPOSTしかないため、@methodディレクティブでDELETEを指定

routes/web.php

ルーティング

DELETEメソッドで所定のURLが要求された場合に、destroy()アクションにルーティング。

routes/web.php

コントローラーでの処理~delete()による削除

  • ルートパラメーターで受け取ったidでデータを取り出し
  • 得られたデータをdelete()で削除
  • トップページにリダイレクト

app/Https/Controllers/StickyNoteController.php

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です