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();
}
}