LaravelAdminで複数カラムのUniqueValidationを行う方法

Laravelロゴ

LaravelAdminで複数カラムのUniqueValidationを行う方法がわからなかったので調査しました。

前提

環境は Laravel8
ユーザーにタグを付与する場合を例にします。
テーブル構成はこんな感じ
users
tags
tag_users 中間テーブル

方法

コントローラーのstore()メソッドをオーバーライドしてこんな感じに書く。

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

// 中略
public function store() {
        $data = request()->all();
        $validator = Validator::make($data, 
            [
                'tag_id' => [
                    'required',
                    Rule::unique('tag_users')->where(function ($query) use ($data) {
                        return $query->where('tag_id', $data['tag_id'])
                            ->where('user_id', $data['user_id']);
                    }),
                ],
                'user_id' => [
                    'required'
                ]
            ],
            [
                'tag_id.unique' => 'そのタグは付与済みです' //エラー時に表示されるメッセージ
            ]
        );

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }
        return $this->form()->store();
    }
}
タイトルとURLをコピーしました