En un proyecto, digamos que tenemos Clientes y cada cliente puede tener un Vale. Sin embargo, el bono puede ser para algo diferente para diferentes clientes: tal vez para un hotel, un automóvil o un vuelo.
Tenemos una tabla de códigos de vales de vuelo, una tabla de códigos de vales de hotel y una tabla de códigos de vales de automóvil.
Por lo tanto, cuando a un cliente se le asigna un cupón, le asignamos el siguiente código para el objeto relevante para el que recibe el cupón. Pero en lugar de tener varias tablas (customer_car_voucher, customer_hotel_voucher, etc.), prefiero tener una tabla Voucher que, a su vez, esté vinculada al tipo de vale correspondiente.
Lo que quiero poder hacer es simplemente ir a $customer->voucher->code para obtener el código relevante, ya sea un vuelo,un hotel o un coche. Es posible que se agreguen otros vales más adelante, ya ves, para diferentes cosas.
Creo que puedo hacer esto usando relaciones transformables: el bono se transforma en automóvil, hotel y vuelo, por lo que dentro de la tabla de bonos hay una variable "voucherable_type" y un "voucherable_id". Pero que me jodan si puedo hacer que funcione.
¿Alguna ayuda, por favor? ¿Lo estoy haciendo mal?
------------------------------------
tienes razón. y como pista usa:
public function customer()
{
return $this->belongsTo(Customer::class):
}
public function voucherable()
{
return $this->morphTo();
}
en modelo bono.
y para cada vuelo, coche, hotel incluye:
public function voucher(){
return $this->morphOne(Voucher::class,'voucherable');
}
También puedes ver la relación de transformación de Laravel para obtener más ayuda.
------------------------------------
En Eloquent ORM de Laravel se utiliza para relaciones transformables.
Primero, crea dos modelos AirVoucher y Voucher.
Primero, el modelo AirVoucher utiliza la siguiente relación.
public function voucher()
{
return $this->morphOne(Voucher::class, 'voucherable');
}
En segundo lugar, el modelo de vale utiliza la siguiente relación.
public function voucherable()
{
return $this->morphTo();
}
Puedes utilizar el siguiente documento de relación oficial de Laravel para obtener más ayuda.
Relaciones de transformación de Laravel.
------------------------------------
debes usar relaciones polimórficas de laravel.
en el modelo de vale, establezca este modelo como modelo polimorfo (nombre de función = nombre del modelo+"able"):
public function voucherable() \Illuminate\Database\Eloquent\Relations\MorphTo
{
return $this->morphTo();
}
luego, en Modelo de automóvil (u hotel/lucha), establezca la relación (nombre de función = nombre del polimorfo):
si cada coche tiene un bono, utiliza morphOne:
public function files(): \Illuminate\Database\Eloquent\Relations\MorphOne
{
return $this->morphOne(Voucher::class, 'voucherable');
}
si cada automóvil tiene muchos vales, use morphMany:
public function files(): \Illuminate\Database\Eloquent\Relations\MorphMany
{
return $this->morphMany(Voucher::class, 'voucherable');
}
Recuperando la relación
$car = Car::find(1);
$vocher = $car->voucher;
documentos de laravel