12. レコード更新・削除

データ更新

find()

find() は指定した「id」からレコードを1件取得するメソッドです。

Model::find(int id);
SQL
SELECT * FROM テーブル名 WHERE id = ID;

update()

update() はレコード更新するメソッドで、データは連想配列で指定します。

Model::update(連想配列);

すべてのレコードを更新

条件を指定しない場合は、すべてのレコードを更新されるので注意が必要です。

SQL
UPDATE テーブル名 SET (カラム1 = 値1, カラム2 = 値2, ...);

where()

where() は、SQLWHERE句を追加するメソッドです。

Model::where(カラム名, 値, オプション);

オプションなしの場合

where() のオプションがない場合は、条件が = で実行されます。

SQL
WHERE カラム名 = 値

WHEREで更新

レコード更新は通常WHEREで条件指定しますが、Eloquentではメソッドチェーンでコーディングできます。

モデル::where(カラム名, 値)->update(連想配列);
SQL
UPDATE テーブル名 SET (カラム1 = 値1, カラム2 = 値2, ...) WHERE カラム名 = 値;

セッション(Flash)

old()

old() は前回入力したセッションデータを取得するヘルパーメソッドです。セッションは1度だけ有効なFlashとして処理されます。

old(プロパティ名, 初期値)

データ送信とセッション

old() を利用すると、第1引数はセッションデータ(Flash)、第2引数はモデルデータ(DBデータ)で表示できます。

<form action="xxxx" method="post">
   <!-- old() 第1引数:セッション -->
   <!-- old() 第2引数:DBデータ -->
   <input type="text" name="email" value="{{ old('email', $item->email) }}" >
   <button>更新</button>
</form>

商品編集

商品データ取得

ItemControlleredit() で「items」テーブルから1件取得します。

ItemController.php
public function edit(int $id)
{
    $item = Item::find($id);
    $data = ['item' => $item];
    return view('item.edit', $data);
}

商品編集画面

フォーム追加

「item/edit.blade.php」にフォームを追加します。商品名と価格のvalueプロパティには、old() で設定します。

item/edit.blade.php
    <form action="" method="post">
        @csrf
        <div class="form-group mb-3">
            <label for="" class="form-label">商品名</label>
            <input type="text" class="form-control" name="name" value="{{ old->('item', $item->name) }}">
        </div>
        <div class="form-group mb-3">
            <label for="" class="form-label">価格</label>
            <input type="number" class="form-control" name="price" value="{{ old->('item', $item->price) }}">
        </div>
        <div>
            <button class="btn btn-primary w-100">更新</button>
        </div>
    </form>

フォーム送信URL

フォームのactionは「item/update/{id}」の形式で設定します。

item/edit.blade.php
<form action="{{ route('item.update', $item->id) }}" method="post">
    ...
</form>
  • route() の第2引数に値を指定すると、自動的にパスパラメータが生成

レコード更新

ルーティング

POSTリクエスト「/item/update/{id}」をルーティングします。

web.php
Route::post('/item/update/{id}', [ItemController::class, 'udpate'])->name('item.udpate');

レコード更新処理

トークン削除

ItemControllerupdate() ではリクエストデータ取得します。データにはCSRF処理対策の「_token」データが含まれているため、事前に削除しておきます。

ItemController.php
    public function update(Request $request, $id)
    {
        $posts = $request->all();
        unset($posts['_token']);
    }

レコード更新

商品データの更新し、編集画面にリダイレクトします。

ItemController.php
    public function update(Request $request, $id)
    {
        $posts = $request->all();
        unset($posts['_token']);
        Item::where('id', $id)->update($posts);
        return redirect()->route('item.edit', $id);
    }
  • 編集画面へのリダイレクトURLには「items.id」が必要です。

レコード削除

destroy()

destroy() はレコード削除するメソッドで、基本的にはテーブルのidを指定します。

Model::destroy(int $id);
SQL
DELETE FROM テーブル名 WHERE id = :id;

delete()

delete() は、選択したレコードを削除するメソッドです。where() と併用して実行します。

Model::where(条件)->delete();
SQL
DELETE FROM テーブル名 WHERE 条件;

レコード削除処理

Rouging

POSTリクエスト「/item/destroy/{id}」をルーティングします。

web.php
Route::post('/item/destroy/{id}', [ItemController::class, 'destroy'])->name('item.destroy');

Controller

商品データを削除し、処理後は「item/index」にリダイレクトします。

ItemController.php
    public function destroy(int $id)
    {
        Item::destroy($id);
        return redirect()->route('item.index');
    }

View

「edit.blade.php」にフォームボタンを追加し、「item/destroy/{id}」にPOSTリクエストします。

edit.blade.php
    <div>
        <form action="{{ route('item.destroy', $item->id) }}" method="post">
            @csrf
            <button class="btn btn-danger w-100 mb-2">削除</button>
        </form>
    </div>

動作確認

削除処理の動作確認をしてみましょう。

Laravel超入門