tutorial-laravel

Relación 1 a N en Laravel

Mientras realizaba una pequeña Api de un proyecto, con el objetivo de aprender y reforzar lo que sabía de Laravel me tope con un detalle cuando quise usar las relaciones Eloquent entre modelos, sin embargo me costo comprender como plasmar las relaciones como la relación 1 a N que en la Base de Datos se ve tan simple a una relación entre los modelos. 

En Laravel las tablas están representadas en los modelos, son las que se encargan de comunicarse con la base de datos. Las relaciones eloquent se definen como métodos en sus clases modelo de cada tabla.

Al definir las relaciones como método proporciona capacidades de encadenar métodos y consultas.

Empezaremos por la relación de uno a muchos (1 a N) , esto quiere decir que un registro estará relacionado a muchos registros.

En este caso tenemos la tabla users con el modelo User y la tablas hotel con el modelo Hotel, la relación entre ellas es la siguiente: un usuario  puede tener registrado muchos Hoteles y cada Hotel solo le puede pertenecer a un usuario, por lo que será una relación uno a muchos.

Un Hotel se relaciona a un Usuario

Un Usuario puede tener muchos Hoteles

relación 1 a muchos

Tomaremos la N (muchos) como referencia por lo cual la relación es de 1 usuario con N hoteles.

Relación 1 a N en el modelo User

 Para definir la relación creamos un método en el modelo, podemos colocar el nombre que deseemos a la relación, sin embargo recomiendo que usemos el nombre de la tabla a la que queremos relacionar (hotel)

 <?php

namespace App\Models;

class User 
{
public function hoteles(){

    return $this->hasMany(hoteles::class,'idusuario','id');
}

}

El método hoteles() es el que implementa la relación. Devolvemos el valor de retorno del método hasMany() de los modelos Eloquent.

En hasMany debemos indicar el nombre de la clase del modelo con el que lo estamos relacionando.

Con esto Laravel entiende que en la tabla «hotel» se encontrara la clave foránea con el usuario que sea (user_id) y que en la tabla user la clave primaria es «id».

hasMany puede recibir como parámetros los nombres de las llaves foráneas, ejemplo: si en la tabla hoteles a clave foránea tuviera otro nombre distinto de usuario_id, podríamos indicarlo así:

return $this->hasMany(hoteles::class,'nombre de clave foránea');

Si demas en la tabla de usuarios la clave primaria no se llama «id» también podemos indicarlo de la siguiente forma:

return $this->hasMany( hoteles::class, 'nombre clave foránea en tabla hoteles', 'nombre de la clave en tabla usuarios');

Relación 1 a N en el modelo Hoteles

Al realizar esta relación nos permitira acceder al usuario que ha dado de alta el hotel. Vamos a definir un método en el modelo de la misma manera que el caso anterior podemos colocar el nombre deseado pero sugiero colocar el de la tabla a la que se relacionara «Usuario» para este caso.

La relación será singular ya que solo se relacionara a un registro de la tabla «hotel». El método que recibe la relación contiene el retorno del método belongsTo().

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class hoteles extends Model
{
   
  public function User(){

        return $this->belongsTo(User::class,'id','idusuario');
    }

}

Al igual que en el caso del modelo User , el método belongsTo() también puede recibir parámetros para indicar el nombre de la clave primaria o clave principal de la tablas.

return $this->belongsTo(User::class, 'nombre clave foránea en tabla user', 'nombre clave en la clave hoteles');

 Con esto Laravel entiende que Usuarios  tendrá muchos Hoteles(hasMany) y un Hotel le va a pertenece a un solo Usuario (belongsTo).

Acceso a la datos de las tablas relacionadas

Después de definir la relación podemos acceder a los datos de la tabla relacionada (hoteles) en cualquier modelo de User.

Vamos a usar el método «hoteles» que es la relación en el modelo User.

public function userHotel() {

    
   $idu= Auth::id(); //obtener ID
   $usuario = User::find($idu); //
   $hoteles=$usuario->hoteles;  // Usamos el método hoteles

      return response($hoteles,200);

    }

Al ejecutar el método obtendremos una colección de hoteles.

[
    {
        "idhotel": 4,
        "macwifi": "4",
        "nombre": "HotelPRE",
        "created_at": "2021-03-28 15:48:45",
        "updated_at": "2021-03-28 15:46:15",
        "idpais": 12,
        "idusuario": 3
    },
    {
        "idhotel": 8,
        "macwifi": "SSKDJINR5667344",
        "nombre": "HProvisional",
        "created_at": "2021-05-28 18:44:18",
        "updated_at": "2021-05-28 18:44:18",
        "idpais": 42,
        "idusuario": 3
    },
    {
        "idhotel": 11,
        "macwifi": "JSHUSHISBSI90393",
        "nombre": "HProvisional",
        "created_at": "2021-05-28 18:44:22",
        "updated_at": "2021-05-28 18:44:22",
        "idpais": 42,
        "idusuario": 3
    }
]

Esta es la manera en que puede visualizar la relación 1 a N en los modelos en Laravel para que se ha mas sencillo acceder a los datos desde las tablas relacionadas.

Espero que la información pueda ser de utilidad y ayude a aclarar el dudas de las relaciones en Laravel.

Si quieren mas detalles les dejo el link de la documentación oficial de Laravel. Relaciones Laravel.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.