laravel8のAPIサーバで、複数レコードデータをJSONデータで受け取って、upsertしてみた。
1. postmanからjsonデータを送信してみる。
メソッドをpost
Bodyタブ
rawラジオボタン
JSONプルダウンを選択
1 2 3 4 5 |
[ {"id": 1, "name": "adam", "email": "adam@example.com"}, {"id": 2, "name": "bell", "email": "bell@example.com"}, {"name": "cecil", "email": "cecil@example.com"} ] |
2. コントローラーかモデルで、JSONデータ受け取る
1 2 3 4 |
public static function multi_upsert(Request $request) { return $request->all(); } |
3. JSONデータのバリデーション
JSONデータの1行ずつバリデーションする。
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 |
public static function multi_upsert(Request $request) { //バリデーションルールを設定 $rules = [ 'name' => 'required|string', 'email' => 'required|email', ]; // 1行ずつの検証 $i = 1; // バリデーションエラーがあった行 foreach ($request->all() as $key => $value) { $validator = \Validator::make($value, $rules); //バリデーションルールでエラーの場合 if ($validator->fails()) { return response()->ApiFailed( "$i Line multi_upsert Failed", $validator->errors() ); } $i++; } // idがあったらupdate, 無かったらinsert User::upsert($request->all(), ['id']); } |
4. 複数upsertは、eloquentの標準メソッドに追加されてた!
https://zenn.dev/y640/articles/9f66d6abfeecf6