es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo actualizar el formulario maestro y de detalle en Laravel?

Tengo este código en el controlador para actualizar los datos de la base de datos:

“`public function update(Request $request, $id)
{
$anodizing = Anodizing::find($id);
$anodizing->date= $request->date;
$anodizing->number= $request->number;
$anodizing->item_total = $request->item_total;
$anodizing->desc= $request->desc;
if ($request->hasFile('picture')) {
$anodizing_image = public_path("uploads/reports/anodizing/{$anodizing->picture}");
if (File::exists($anodizing_image)) {
File::delete($anodizing_image);
};
$file = $request->file('picture');
$extension = $file->getClientOriginalExtension();
$filename = $request->number. '-' . date('YmdHms') . '.' . $extension;
$file->move('uploads/reports/anodizing', $filename);
$anodizing->picture= $filename;
}
$anodizing->save();

<pre><code>$id = $anodizing->id;
foreach ($request->addmore as $key => $value) {
$anodizingdetail = AnodizingDetail::find($value['id']);
$anodizingdetail->aluminium_id= $value['name'];
$anodizingdetail->qty = $value['qty'];
$anodizingdetail->weight= $value['weight'];
$anodizingdetail->save();
}
</code></pre>

}“`

Básicamente, este método de actualización funciona perfectamente para actualizar o editar datos existentes, pero el problema es, ¿qué hago si quiero editar y luego insertar una nueva fila en el formulario de detalle?

Soy consciente del método updateorCreate en Laravel, ¿es ese el método correcto? ¿Cómo usarlo? ¿O necesito usar algo más?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para editar e insertar una nueva fila en el formulario de detalles, se puede utilizar el método updateOrCreate en Laravel. Este método intentará actualizar el registro con los atributos coincidentes y, si no se encuentra, creará uno nuevo con los atributos proporcionados.

    Aquí hay un ejemplo de cómo se puede usar updateOrCreate en su código:

    public function update(Request $request, $id)
    {
        $anodizing = Anodizing::find($id);
        // actualizar registro principal
        $anodizing->date = $request->date;
        $anodizing->number = $request->number;
        $anodizing->item_total = $request->item_total;
        $anodizing->desc = $request->desc;
        if ($request->hasFile('picture')) {
            // cargar nuevo archivo de imagen
            $anodizing_image = public_path("uploads/reports/anodizing/{$anodizing->picture}");
            if (File::exists($anodizing_image)) {
                File::delete($anodizing_image);
            };
            $file = $request->file('picture');
            $extension = $file->getClientOriginalExtension();
            $filename = $request->number. '-' . date('YmdHms') . '.' . $extension;
            $file->move('uploads/reports/anodizing', $filename);
            $anodizing->picture= $filename;
        }
        $anodizing->save();
    
        $id = $anodizing->id;
        // actualizar o crear registros de detalle
        foreach ($request->addmore as $key => $value) {
            $anodizingdetail = AnodizingDetail::updateOrCreate(
                ['id' => $value['id']],
                [
                    'anodizing_id' => $id,
                    'aluminium_id' => $value['name'],
                    'qty' => $value['qty'],
                    'weight' => $value['weight']
                ]
            );
        }
    }
    

    En el bucle foreach, el método updateOrCreate comprueba si existe un registro con el id proporcionado en la tabla AnodizingDetail. Si existe, actualiza el registro con los atributos proporcionados. Si no, crea un nuevo registro con los atributos proporcionados y el anodizing_id establecido en el id actual del registro principal.

    También se pueden utilizar otros métodos como firstOrCreate o update según sus necesidades.

Comments are closed.