Cómo crear un modelo en Laravel automáticamente cuando se crea otro modelo

Cómo crear una instancia de un modelo en Laravel, cuando se crea una instancia de otro modelo en la base de datos

Cómo crear un modelo en Laravel automáticamente cuando se crea otro modelo
Photo by Phil Shaw / Unsplash

La Necesidad

Para un proyecto que estoy desarrollando, necesito crear un "wallet" para cada usuario que se crea en el sistema.

Es decir, cuando se ejecuta el User::create(...) quiero que en ese momento se cree una instancia de Wallet asignada a ese usuario

Para esto sirven los Observer

Un observer sirve para estar "viendo" los eventos que ocurren en el ORM, como es el hecho de que se cree una instancia de un modelo

  1. Creamos el Observer
> php artisan make:observer UserObserver --model=User
  1. En el método boot() de \App\Providers\AppServiceProvider:
public function boot()
{
  User::observe(UserObserver::class);
}
  • Es importante recordar que hay que importar la clase UserObserver
  1. En el método created(...) de \App\Observers\UserObserver.php:
public function created(User $user)
{
  $user->wallets()->create([
    'moneda' => 'VMXN',
    'monto' => 10000,
  ]);
}

Hay varios métodos dentro del observer, y corresponden a varios eventos que pueden ocurrir en el ORM, pero en este caso me interesa observar cuando se inserta una relación. Cuando esto ocurre, se toma el objeto recién creado y a través de la relación existente, se crea el otro modelo.