> Faqs > Actualizo un modelo Laravel y hago el save() pero no se guarda en la base de datos

Actualizo un modelo Laravel y hago el save() pero no se guarda en la base de datos

En un modelo laravel tengo este método

public function updateVisibility($visibility) {
    info('lo que pongo a id:' . $this->id);
    info($visibility ? 1 : 0);
    $this->visible = $visibility ? 1 : 0;
    $this->save();
}

He verificado que lo que recibe como parametro en $visibility es un bool false.

el tema es que después de ejecutar el método "visible" no se cambia a false.

la migracion está asi:

public function up(): void
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('title', 80);
        $table->text('description');
        $table->boolean('visible')->default(false);

        $table->softDeletes();

        $table->timestamps();
    });
}

Respuestas

Entiendo que con tus info() estás verificando las situaciones más típicas por tu mensaje veo que la situación puede estar bastante bien aparentemente.

  1. Asegurarte de que el campo está recibido correctamente. Me refiero a $visibility.
  2. Asegúrate que el modelo se ha dado como actualizado, porque si laravel no entiende que el modelo ha sido cambiado no hará nada con el save()

Para verificar si el modelo ha cambiado puedes usar isDirty().

if ($this->isDirty('visible')) {
        info('El campo "visible" ha cambiado, guardando...');
}
  1. También puedes verificar si estás llegando a hacer el update en la base de datos. Te sugiero activar el log de consultas a la base de datos.

Lo activas con \DB::enableQueryLog(). Pero tienes que activarlo antes de hacer consultas, porque si lo activas demasiado tarde no funciona. Por ejemplo te sugiero hacerlo en el constructor del controlador.

public function __construct() {
    \DB::enableQueryLog();
}

Luego puedes ver el log de consultas (después de hacer el save) con este código:

info(\DB::getQueryLog());

Si no ves el update es que la consulta no se ha realizado.

  1. Prueba a hacer la consulta de actualización de manera explícita.
$this->where('id', $this->id)->update(['visible' => $visibility ? 1 : 0]);

Eso debería asegurarte que la consulta se ejecuta perfectamente. Revisa el log de consultas para ver si se se ha ejecutado.

Supongo que haciendo todas estas cosas en un momento u otro encontrarás el problema que había. Pero yo me inclinaría a que Eloquent no está entendiendo que tu modelo Laravel está actualizándose y por eso no hace el update cuando invocas save().

Miguel Angel
3295 146 215 17