🎉 Acceso anticipado Black Friday: Hasta un 80% de descuento en nuestros cursos

6d: 12h: 26m:16s'
Carlos
Carlos
Laravel
Comparte:

¿Cómo representar una categorización/generalización en Laravel?

Buenos días, primero que nada felicidades por tus vídeos de gran calidad; personalmente he aprendido un montón gracias a ti. 
Tengo una duda y no he encontrado información al respecto en internet, nadie me ha respondido en https://es.stackoverflow.com y tampoco lo encontré la respuesta en tus vídeos (por lo que me estoy empezando a preocupar).
Tengo que dar de alta publicadores,pero hay distintos tipos de publicadores y creo que luego de terminar el desarrollo se va a desear añadir más ¿Cómo puedo hacer algo genérico? 
Lo he pensando y creo que la mejorar forma es hacer una Categorización o Generalización (no sé como lo llamarás tu), pero para que nos entendamos te dejaré una imagen (https://i.stack.imgur.com/HdgNc.png). Este tipo de relación permite que los publicadores tengan información en común, pero dependiendo del tipo de publicador tendrán información a extra.
¿Cómo hago esto en Laravel? ¿Es una relación 1 a 1? ¿Cómo hago el formulario de alta? ¿Primero hago que se de alta un publicador y luego se asigne a un tipo o todo en el mismo formulario?
Agradecería tu respuesta, y si la respuesta está en alguno de tus vídeos de pago, me suscribiré.
Gracias de antemano. 
Saludos. 

Jorge Davila
Jorge Davila (838 xp)
Primero que nada te recomiendo que te suscribas , el contenido del instructor de muy buena calidad y es de los que mejor explican de los instructores que he visto en varias plataformas.

En tu caso creo que lo mas conveniente es que utilices el patrón de diseño
Factory/Builder.

Este seria un ejemplo muy burdo de como hacerlo:

class Publishers
{
    protected $_publisher;
    protected $_request;


    public function new()
    {
      return $this->craftPublisher();
    }

    public function craftPublisher()
    {
        $this->_publisher=[
            'name'=>$this->getName(),
            'firmware'=>$this->getFirmawareVersion(),
            'status'=>$this->getStatus(),
            'date'=>$this->getDate()
        ];
        return $this;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName(string $name="default publisher name")
    {
        $this->name=$name;
    }

    public function setFirmwareVersion(float $version=0)
    {
        $this->version=$version;
    }
    public function getFirmawareVersion()
    {
        return $this->version;
    }

    public function setStatus(bool $status=true)
    {
        $this->status=true;
    }
    public function getStatus()
    {
        return $this->status;
    }

    public function setDate(string $date="")
    {
        $this->date=blank($date)?Carbon::now()->timezone('CDT')->format('Y-m-d'):$date;
    }
    public function getDate()
    {
        return $this->date;
    }

    public function getPublisher()
    {
        return $this->_publisher;
    }

    public function withSensor(string $sensor)
    {
        $this->_publisher['batDate']=$sensor;
        return $this;
    }

    public function withProvider(string $provider)
    {
        $this->_publisher['provider']=$provider;
        $this->hasProvider=true;
        return $this;
    }
    public function withEnviroment(string $enviroment="local")
    {
        $this->_publisher['enviroment']=$enviroment;
        $this->hasEnviroment=true;               
        return $this;    
    }

   public function has($property)
   {  
      return property_exists($this,$property);}
   }
}

Esto siempre te devolvería un arreglo de datos.
Puedes adaptarlo para pasarle en el constructor un request y que en automático el mismo haga el seteo de las propiedades. 



public function store(Publishers $publisherContainer)
{
   $publisher=
Publisher::create($publisherContainer->getPublisher()); 
if($publisherContainer->has('sensor'))
{
   $publisher->sensor()->create($publisherContainer->getPublisher());
} 

if($publisherContainer->has('provider'))
{
   $publisher->provider()->create($publisherContainer->getPublisher());

}

 if($publisherContainer->has('enviroment'))
{
   $publisher->enviroment()->create($publisherContainer->getPublisher());
}

return $publisher; }


Obviamente al ser una prueba tiene varios huecos que deberías llenar y se puede optimizar bastante.

También podrías implementar un decorador que extienda el factory para agregar las funcionalidades y agregar las validaciones pertinentes entre otras cosas. Simplemente desarrolla bien tu lógica, revisa  los patrones de diseño y comienza a desarrollar una vez que tengas bien plasmada la idea de lo que tienes que hacer.

PD. En varios de los cursos que hay en la plataforma el instructor explica los patrones de diseño,la reutilizacion de formularios y varias otras cosas que te servirian para desarrollar tu proyecto. '
Carlos
Carlos (12 xp)
Gracias por tu respuesta. ¿Cómo serían las tablas? ¿irían todos los atributos en una misma tabla?
Jorge Davila
Jorge Davila (838 xp)
No realmente.Si necesitas relaciones crea las relaciones. La idea de este modelo es que te retorne un objeto generico que varie dependiendo de que necesitas agregarle o quitarle. Adaptalo a tus necesidades. Por parte de eloquent con que le pases la propiedad $fillable correctamente podrias pasarle los datos para crear cada relacion facilmente pasandole todo el conjunto de datos ya que ignoraria el resto.