echa un vistazo a esta tabla primero y luego te explico.
parent { id:number; name:string; } child { id:number; name:string; parent_id:number; //foreignKey to parent table }y esta es la solicitud de API para hacer una actualización al backend
Request = { id:1; //parent id name:'update the name'; childs:[ { id:1, name:'child 1' }, { id:null, //if null its mean i have to create this child name:'child 2' } ] }entonces, si Request.childs tiene una identificación en cada elemento, entonces tengo que actualizar el niño, pero si no tiene una identificación, tengo que crear un nuevo niño.
Y si el niño no existe en Request.childs, tengo que eliminarlo.
mi pregunta es ¿cómo elimino el niño anterior que no existe en Request.childs?
lo que estoy haciendo ahora es eliminar todo el elemento secundario que pertenece a parent_id y crear un nuevo elemento secundario basado en la Solicitud, pero dado que el elemento secundario tiene una eliminación parcial en todo el elemento secundario eliminado, se apilará en la base de datos.
lo que estoy haciendo actualmente
{ child::where('parent_id',Request->id)->delete(); foreach($Request->childs as $item){ child::create['name'=>$item->name,'parent_id'=>$Request->id]; } }lo que probablemente tengo que hacer
foreach($Request->childs as $item){ if($item->id == null){ child::create['name'=>$item->name,'parent_id'=>$Request->id]; } child::find($item->id)->update['name'=>$item->name]; }Simplemente no sé cómo eliminar el registro secundario anterior sin eliminar todo.
Esta es la forma en que yo lo haría:
public function patch(Request $request) { Child::whereNotIn('id', array_column($request->childs, 'id'))->delete(); Child::upsert([ $request->childs ], ['id'], ['name']); }Si no desea eliminar temporalmente al niño, puede aplicar forceDelete()
como a continuación:
child::where('parent_id',Request->id)->forceDelete(); foreach($Request->childs as $item) { if($item->id == null){ child::create['name'=>$item->name,'parent_id'=>$Request->id]; } child::find($item->id)->update['name'=>$item->name]; }Solo necesita obtener las identificaciones de la base de datos y comparar
{ $childIds = child::where('parent_id',Request->id)->pluck('id')->toArray(); $flippedChildIds = array_flip($childIds);// we flip the keys and values for easy unsetting. $childsToBeInsertedOrUpdated = []; foreach($Request->childs as $item){ //add deleted at in case a child was deleted and need to be re activated // if you dont want the child to be reactivated, remove "deleted_at" from both arrays $childsToBeInsertedOrUpdated[] = ['id' => $item->id, 'name' => $item->name, 'deleted_at' => null]; //if exists, remove from the to be deleted childs unset($flippedChildIds[$item->id])); } //only two request for delete and update/create (faster) if ($flippedChildIds) { Child::whereIn('id', array_keys($flippedChildIds))->delete(); } if ($childsToBeInsertedOrUpdated) { Child::upsert($childsToBeInsertedOrUpdated, ['id'], ['name', 'deleted_at']); } }