Laravel – データ削除

delete~データの削除

データを削除するルーティングとしてdeleteが準備されている。

前提

モデルデータの操作で準備した枠組みを使う。ユーザー認証機能を持ち、ユーザーごとに入力されたシンプルな投稿記事Postを扱う。

流れ

  1. DELETEメソッドでリクエスト
  2. posts.deleteルートでPostsControllerdestroyアクションを実行
  3. destroyアクションで指定されたデータを削除

destroyアクションの呼び出し

リソースルーティングで以下のように設定されていて、DELETEメソッドによるリクエストの場合、ドメイン/posts/(id)からPostControllerdestroyアクションにルーティングされる。ルーティング名はposts.delete

このルーティングにリクエストする場合、たとえばページの中にフォーム要素とINPUT(type="submit")要素を配置することが考えられる。

ここでルーティングに従えばDELETEメソッドを明示する必要があるが、現在のブラウザーではGETとPOSTしか認識しない。

フォームからDELETEメソッドをリクエストする場合、以下のようにフォームのmethodではPOSTを指定し、Laravelの@methodディレクティブでDELETEを指定する。

この例では、フォームのaction先にroute()メソッドを使い、第一引数でposts.daestroyのルーティング名を、第2引数で削除対象のデータ$postを渡している。これによってDELETEメソッドでURIとしてドメイン名/posts/(id)が渡される

なお@methodディレクティブは、以下のようなhidden要素を生成する。

コントローラー~destroyアクション

ルーティングに従って、PostControllerdestroyアクションを以下のように記述する。

ここでの要点は以下の通り。

  • destroy()メソッドの引数で、URLに埋め込まれたid$idとして受け取られている
  • Postクラスのfind()メソッドの引数に$idを渡して、指定したidの記事インスタンスを$postで参照している
  • 削除対象記事のインスタンス$postdelete()メソッドの引数に、更新対象の要素を渡している
  • データ削除を反映した一覧表示のため、indexにリダイレクトしている

まとめ

以上の設定により、たとえばフォームに配置された削除ボタンを押すと、その記事のidがURLに埋め込まれてDELTEメソッドでリクエストされ、destroyアクションでデータが削除される。

 

コメントを残す

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