Relaciones Uno a Uno Polimórficas
Comprar curso

99. Relaciones Uno a Uno Polimórficas

En este capítulo, aprenderás cómo establecer relaciones Uno a Uno Polimórficas en Laravel 10 entre dos o más modelos de la base de datos. Descubre cómo definir la relación y cómo acceder a los datos relacionados.


4 comentarios

Inicia sesión para comentar

Comentarios:

  • Victor Arana Flores

    Victor Arana Flores hace 1 año Destacado

    Si estás trabajando en un proyecto de Laravel 10 y necesitas establecer relaciones Uno a Uno Polimórficas entre dos o más modelos de la base de datos, estás en el lugar correcto. En este capítulo, te enseñaremos cómo definir y acceder a esta relación en Laravel 10.

    Las relaciones Uno a Uno Polimórficas se utilizan cuando tienes varios modelos que necesitan estar relacionados con otro modelo de forma individual, en lugar de tener una relación directa. En Laravel 10, puedes definir esta relación mediante el uso de métodos en los modelos correspondientes.

    Para establecer una relación Uno a Uno Polimórfica en Laravel 10, debes crear una tabla de relación polimórfica que contenga las claves foráneas de ambos modelos, y establecer los métodos morphOne y morphTo en los modelos correspondientes. Por ejemplo, si tienes un modelo Comment, un modelo Post y un modelo Video, y cada uno puede tener un único Comment, debes establecer los métodos de la siguiente manera:

    class Comment extends Model
    {
       public function commentable()
       {
           return $this->morphTo();
       }
    }
    class Post extends Model
    {
       public function comment()
       {
           return $this->morphOne(Comment::class, 'commentable');
       }
    }
    class Video extends Model
    {
       public function comment()
       {
           return $this->morphOne(Comment::class, 'commentable');
       }
    }

    En este ejemplo, el método morphTo en el modelo Comment establece que la relación es polimórfica, y el método morphOne en los modelos Post y Video establece la relación Uno a Uno polimórfica entre el modelo Comment y el modelo correspondiente. Además, se especifica el nombre de la columna que contiene el tipo de modelo y la clave foránea del modelo en la tabla de relación polimórfica.

    Una vez definida la relación, puedes acceder a los datos relacionados mediante el uso de métodos en una instancia del modelo principal. Por ejemplo, si deseas obtener el comentario de un post con un ID específico, puedes hacerlo de la siguiente manera:

    $post = Post::find(1);
    $comment = $post->comment;

    En resumen, si necesitas establecer relaciones Uno a Uno Polimórficas en Laravel 10, debes crear una tabla de relación polimórfica y establecer los métodos morphOne y morphTo en los modelos correspondientes. Una vez definida la relación, puedes acceder a los datos relacionados mediante el uso de métodos en una instancia del modelo principal. Esperamos que esta información te haya sido útil en tu proyecto de Laravel 10.

  • Juan Montoya Vega

    Juan Montoya Vega hace 10 meses

    Hola, una consulta, para la relacion uno a uno polimórfica, no deberían ser llaves primarias imageable_id y el imageable_type?

    $table->unsignedBigInteger('imageable_id');
    $table->string('imageable_type');
    $table->primary(['imageable_id', 'imageable_type']);

    Al colocar : 

    $table->morphs('imageable');

    se crean los campos, pero hay alguna manera de que tambien se creen las llaves primarias? o se tendría que hacer con las 3 líneas anteriores de arriba?.

    Te comento porque en otro video lo explicaste de esa manera en este tipo de relación.

    Muchas gracias de antemano, muy buenos videos y felices fiestas :D

    • Victor Arana Flores hace 10 meses

      Hola Juan, creo que estás confundiendo conceptos.

      La llave primaria es una llave que identifica a un registro y es unica. Llave foranea es cuando haces referencia a una llave primaria desde otra tabla.

      $table->morphs('imageable'); lo que hace es crear las llaves foraneas, no tendrías por que aplicarle una llave primaria. Y es más si le aplcias te va dar error cuando empieces a poner datos y haya datos duplicados en ese campo.

      Lo que quizas estes preguntando es como agregar restricción de llave foranea. En el caso especifico de las polimorficas no se asigna esta restricción (por lo menos no a nivel de bbdd) pero podemos agregar restricciones a nivel de Eloquent.

    • Juan Montoya Vega hace 10 meses

      Hola, lo que pasa es que antes habia visto tu video en youtube del uno a uno polimorfico y lo hiciste de esta manera, mas que todo esa es mi duda, ya que aqui no le pusiste la llave primaria compuesta, o no es necesario? en el minuto 10.25

      Muchas gracias de antemano.

    • Inescop hace 4 meses

      Pues no sé por qué no contesta. Es importante saber si hay que crear un id o si es más correcto/formal crear la clave primaria compuesta

  • Juan Pintos

    Juan Pintos hace 1 año

    El ejemplo del video y el ejemplo del comentario destacado de Victor considera que solo va a existir una imagen por post y un comentario por post verdad? de otra manera se romperia el esquema uno a uno.

  • Hugo Emanuel Ifran

    Hugo Emanuel Ifran hace 1 año

       Illuminate\Database\QueryException  SQLSTATE[42S02]: Base table or view not found: 1146 Table 'relaciones.commentables' doesn't exist (Connection: mysql, SQL: select `comments`.*, `commentables`.`commentable_id` as `pivot_commentable_id`, `commentables`.`comment_id` as `pivot_comment_id`, `commentables`.`commentable_type` as `pivot_commentable_type` from `comments` inner join `commentables` on `comments`.`id` = `commentables`.`comment_id` where `commentables`.`commentable_id` = 1 and `commentables`.`commentable_type` = App\Models\Post).

    me sale ese error de mysql cuando trato de relacionarlas, nose poorque sera