TransWikia.com

Problema con created_at / updated_at al actualizar registro en laravel 5.6

Stack Overflow en español Asked on December 11, 2021

introducir la descripción de la imagen aquíEstoy programando el CRUD de la user (modificada) en mi proyecto laravel (5.6) pero al actualizar un usuario me da conflictos con las fechas de registro/actualización, o al menos eso es lo que he alcanzado a entender luego de revisar varias consultas en la web.

Mi  update: 
 /**
 * Update the specified resource in storage.
 *
 * @param  IlluminateHttpRequest  $request
 * @return IlluminateHttpResponse
 */
public function update(Request $request)
{
    $usuario = User::find($request['id']);
    $usuario->id_role = $request['id_role'];
    $usuario->name = $request['nom_usuario'];
    $usuario->last_name = $request['ape_usuario'];
    $usuario->rut_user = $request['rut_usuario'];
    $usuario->telefono1 = $request['telefono1'];
    $usuario->telefono2 = $request['telefono2'];
    $usuario->email = $request['ema_usuario'];
    $usuario->save();
    return Redirect::to('/usuarios')->with('notice', 'El usuario ha sido modificado correctamente.');
}

Mi modelo:

<?php

 namespace App;

 use IlluminateNotificationsNotifiable;
 use IlluminateFoundationAuthUser as Authenticatable;

class User extends Authenticatable
{
use Notifiable;
/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'email', 'password',
];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

public function getListado(){

    $usuarios = $this->join('roles', 'users.id_role', '=', 'roles.id_role')
                ->select('users.*', 'roles.des_role')
                ->orderBy('name', 'ASC');
    return $usuarios;

}
}  

Al añadir en el modelo el
public $timestamps = false;
Guarda pero no registra la fecha de actualización (que es el cometido de dicha declaración) Sin embargo, eso también necesito guardarlo, obviamente.

Agradezco cualquier aporte.
imagen de error

He estado recurriendo a éste recurso con mucha frecuencia últimamente, creo que es lo mas sano cuando estamos aprendiendo una nueva herramienta y no hallamos la respuesta indicada. Agradezco todas las orientaciones.

3 Answers

Comparto la solución, tal vez le sirva a alguien mas::: Efectivamente!!! El problema con sql server es que el tipo de dato "timestamp" como tal no existe, al crear una tabla, bien sea por migrations o sql, sql server lo toma como datetime, para que laravel funcione correctamente, el tipo de dato para todos los campos de fecha debe ser datetime2...

Gracias a todos por sus aportes!!!

Seguimos aprendiendo :)

Answered by Virginia on December 11, 2021

No tendrías por qué estar actualizando manualmente tu updated_at o created_at.

Si haces una modificación y el modelo no cambia, el updated_at no se actualizará, pero podrías perfectamente, si por X motivo quieres forzar ese cambio, hacer esto:

$tuModelo->touch();

Con eso se actualiza el updated_at.

Ahora bien, otra cosa que me preocupa en lo que veo, es que muestras el fillable de User y tienes esto:

protected $fillable = [
    'name', 'email', 'password',
];

Eso significa, que si utilizas el ->save(); cualquier otra propiedad de tu modelo no se actualizará porque no está en el fillable. Y eso podría estar causando que no se actualice realmente tu modelo (en caso de que ni name, ni email ni password hayan cambiado) y que por eso no cambie el updated_at.

Te aconsejo agregar las otras propiedades del modelo (o columnas de la tabla) que se permitirán modificar, al $fillable. Te quedaría algo así:

protected $fillable = [
    'name',
    'email',
    'password',
    'id_role',
    'last_name',
    'rut_user',
    'telefono1',
    'telefono2'
];

O algo por el estilo según tus campos reales que desconozco.

Lo otro que me queda es preguntarte (pero dudo que sea el problema) es cómo creaste updated_at en tu migración. ¿La creaste así?

$table->timestamps();

Con eso creas el created_at y el updated_at. Lo importante es que sean dateTimes o timestamps para que no tengas problemas.

Answered by Julio Lago on December 11, 2021

Intenta agregar en el update:

public function update(Request $request)
{
    $usuario = User::find($request['id']);
    $usuario->id_role = $request['id_role'];
    $usuario->name = $request['nom_usuario'];
    $usuario->last_name = $request['ape_usuario'];
    $usuario->rut_user = $request['rut_usuario'];
    $usuario->telefono1 = $request['telefono1'];
    $usuario->telefono2 = $request['telefono2'];
    $usuario->email = $request['ema_usuario'];
    $usuario->updated_at = CarbonCarbon::now(); //Agregas la fecha de actualización
    $usuario->save();
    return Redirect::to('/usuarios')->with('notice', 'El usuario ha sido modificado correctamente.');
}

Answered by Eduardo Díaz on December 11, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP