Personalizar columnas en la selección en Relaciones mórficas en Laravel

Video thumbnail

Teniendo una relación mórfica, te voy a mostrar cómo puedes obtener columnas distintas. Así de simple. Aunque suene más complejo de lo que parece, es exactamente lo que puedes ver por aquí.

Yo estoy armando un carrito de compras. Entiéndase que, para mi tienda en línea, los productos pueden ser tutoriales o libros.  ¿Cuál es el dilema?
 

Por ejemplo, para los cursos, yo tengo algunos que incluyen la opción de decidir si quieres:

  • El código fuente por clase.
  • Clases exclusivas.

Esto corresponde al panel que tenemos aquí, y como influye en el precio, sí o sí necesito pasar esa información al carrito de compras.

Este par de columnas no se encuentra definido en el modelo de libro.
En el caso del libro:

Solo se compra completo, sin modalidades adicionales.

Por lo demás, las demás columnas son exactamente las mismas que tengo referenciadas abajo.

La sintaxis es sencilla:

class ShoppingCart extends Model
{
    ***
    public function itemable()
    {
        return $this->morphTo()->constrain([
            Tutorial::class => function ($query) {
                $query->select('id', 'title', 'url_clean', 'price', 'price_offers', 'exclusive_extra', 'price_code_extra');
            },
            Book::class => function ($query) {
                $query->select('id', 'title', 'url_clean', 'price', 'price_offers'); // , NULL as price_exclusive_extra
            },
        ]);
}
  • En el método que indica que es una relación mórfica, creamos un constraint.
  • Indicamos cada una de las relaciones que tengamos.
  • Definimos las columnas que deben existir en cada caso.

En el libro, la definición es más sencilla, ya que no necesita columnas adicionales.
En el curso, sí hay que definir esas columnas extra.

Esto evita que la relación falle buscando columnas inexistentes, como ocurriría si se dejara definida de forma genérica.

Acepto recibir anuncios de interes sobre este Blog.

Te muestro la configuración para que puedas personalizar las columnas en una relación mórfica.

| 👤 Andrés Cruz

🇺🇸 In english