laravel8で、attachする多対多の中間テーブルの存在validationチェックするにはRule::unique(中間テーブル名)を使う。detachはRule::exist(中間テーブル名)
1. すでにある組み合わせなら、validationで弾きたい
2. detachする時も、存在しないなら、validationで弾きたい
1. attachの場合はunique
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 追加 use Illuminate\Validation\Rule; // ビル・フロアに属性タグを関連づける public function attach(Request $request) { //バリデーションルールを設定 $validator = \Validator::make($request->all(), [ // deleted_atがNULLの中から存在チェック 'tag_id' => 'required|exists:tags,id,deleted_at,NULL', 'user_id' => [ 'required', 'exists:users,id,deleted_at,NULL', // 中間テーブル名を指定して、whereで組み合わせるIDを指定する Rule::unique('tag_user')->where(function($query) use($request) { $query->where('tag_id', $request->input('tag_id')); }), ], ], [ // already been takenは分かりづらい 'user_id.unique' => 'already exist!!', ]); //バリデーションルールでエラーの場合 if ($validator->fails()) { return response()->ApiFailed( 'Tag attach Failed', $validator->errors() ); } |
2. detachの場合はexists
1 2 3 4 |
// 存在していない組み合わせは解除できないので、弾く! Rule::exists('tag_user')->where(function($query) use($request) { $query->where('tag_id', $request->input('tag_id')); }), |