laravel8で、hasmanyのリレーション先のレコードを複数作成・更新したい時は、createMany/upsertに配列で渡す
User::Insertと違って、created_at,updated_at, guardedも有効!
post/putで渡すなら、親キー&子レコード情報の配列だよな~。
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 31 32 |
public function store(Request $request) { //バリデーションルールを設定 $validator = \Validator::make($request->all(), [ 'user_id' => 'required|exists:users,id', 'content' => 'required|array', 'content.*' => 'string', // 複数カラムでもOKだけど、他のカラムとの存在チェックの整合性が難しいな・・・。 ]); //バリデーションルールでエラーの場合 if ($validator->fails()) { return response()->ApiFailed( 'Insert Failed', $validator->errors() ); } // 親レコードを取得 $user = User::find($request->user_id); // リニューアル履歴の複数データを配列化 $data = $request->toArray(); for($i=0; $i<count($data['content']); $i++){ $insert_data[] = [ 'content' => $data['content'][$i], // 複数カラムでもOK ]; } // リニューアル履歴の複数データを一括登録 $user->posts()->createMany($insert_data); // 一括登録したデータを返しておく return $insert_data; } |
複数件のレコードの一括アップデートは、post_idが分からないと出来ないよな~。
createManyみたいにupdateManyがあるかと思ったら無いっぽい。
laravel8からupsertが使えるみたいだから、validationでpost_idの存在チェックすれば、updateManyみたいな感じになった。
https://zenn.dev/y640/articles/9f66d6abfeecf6
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 31 32 33 34 |
public function update(Request $request, $id) { //バリデーションルールを設定 $validator = \Validator::make($request->all(), [ // 存在しないIDは更新できない 'id' => 'required|array', 'id.*' => 'required|exists:posts,id|integer', 'content' => 'required|array', 'content.*' => 'string', ]); //バリデーションルールにでエラーの場合 if ($validator->fails()) { return response()->ApiFailed( 'Update Failed', $validator->errors() ); } // リニューアル履歴の複数データを配列化 $data = $request->toArray(); for($i=0; $i<count($data['id']); $i++){ $update_data[] = [ 'id' => $data['id'][$i], 'content' => $data['content'][$i], // 複数カラムでもOKだけど、他のカラムとの存在チェックの整合性が難しいな・・・。 ]; } // 複数データを一括更新(id指定なのでリレーションは無関係!) Post::upsert($update_data, ['id']); // 更新した情報を返す return response()->ApiSuccess( 'Update Success!', $update_data ); |