Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

320
Vistas
(Mysql) ¿cómo actualizo el padre y su referencia en el backend?

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.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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']); }
over 4 years ago · Santiago Trujillo Denunciar

0

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]; }
over 4 years ago · Santiago Trujillo Denunciar

0


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']); } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda