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
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
- Creamos el Observer
> php artisan make:observer UserObserver --model=User
- 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
- 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.