Luchando con las relaciones transformables de Laravel

CorePress2024-01-25  249

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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare