0

Estoy haciendo una api con laravel (a modo de aprendizaje), tengo en mi base de datos dos tablas una es Avisos y otra llamada Valoraciones, avisos contiene como su nombre lo dice avisos que pueden ser comentados, osea tener varios comentarios (valoraciones = comentarios) La relacion de las tablas es 1(aviso) a muchos(comentarios)

Lo que quiero es traer todos los comentarios que contiene una publicación de la siguiente manera:

Aviso{//esto es a modo de ejemplo
   idAviso:1,
   tituloAviso:"Ejemplo de titulo",
   descripcionAviso:"Ejemplo de descrpoicion",
   valoraciones:[
      {
        idValoracion:1,
        DespcripcionValoracion:"ejemplo de descripcion"
      },
      {
        idValoracion:2,
        DespcripcionValoracion:"ejemplo de descripcion2sada"
      }
   ]
}

Lo que he intentado hasta el momento es usar un left join pero no son los resultados esperados, como muestro a continuacion

[
   {
    "id": 60,
    "titulo": "Ejemplo1",
    "descripcion": "Ejemplo1",
    "imagen": "ErrorIngresoHosp.jpg",
    "fecha": "2022-06-02 18:59:05",
    "name": "David Garcia",
    "comentario": "Ejemplo de comentario.."
   },
   {
    "id": 60,
    "titulo": "Ejemplo1",
    "descripcion": "Ejemplo1",
    "imagen": "ErrorIngresoHosp.jpg",
    "fecha": "2022-06-02 18:59:05",
    "name": "David Garcia",
    "comentario": "exste es otro ejemplo de comentario"
   },
   {
    "id": 61,
    "titulo": "Ejemplo2",
    "descripcion": "Ejemplo2",
    "imagen": "ErrorIngresoHosp.jpg",
    "fecha": "2022-06-02 18:59:13",
    "name": "David Garcia",
    "comentario": null
   },
   {
    "id": 62,
    "titulo": "Ejemplo3",
    "descripcion": "Ejemplo3",
    "imagen": "Hacker-Anonymous-wants-you.png",
    "fecha": "2022-06-03 15:21:56",
    "name": "David Garcia",
    "comentario": null
   }
 ]

Como se puede observar cada publicación que tiene comentario la trae dos veces por eso la publicación con id 60 esta dos veces porque ha sido comentada dos veces, actualmente my query esta de esta forma:

public function index()
{
    //Listamos todos los avisos
    $avisos = new Avisos();
    $avisos =  Avisos::select(
        'Avisos.id',
        'Avisos.titulo',
        'Avisos.descripcion',
        'Avisos.imagen',
        'Avisos.created_at as fecha',
        'users.name',
        'valoraciones.comentario'
        )->join('categorias','categorias.id', '=','avisos.idCategoria')
        ->join('estados','estados.id', '=','avisos.idEstado')
        ->join('users','users.id', '=','avisos.idUsuario')
        ->leftjoin('valoraciones','valoraciones.idAviso', '=','avisos.id')
        ->get(); 
    return response()->json([ 
        "Avisos" => $avisos
    ], Response::HTTP_OK);
}

Si la comunidad de desarrolladores me puede ayudar lo agradecería, o guiarme como podria ser mejor, en caso de que necesite usar subconsultas

Imagen de base de datos introducir la descripción de la imagen aquí

1
  • ¿Puedes agregar el código de tu modelo Avisos? Si ya tienes la relación definida ahí puedes usarla.
    – Jacobo
    Commented el 15 jul. 2022 a las 19:18

1 respuesta 1

2

Puedes utilizar Eloquent para facilitar el listado de las relaciones.

En tu modelo de avisos (app/Models/Aviso.php si estás usando php >= 8.0) creas la relación con valoraciones:

public function valoraciones()
{
    return $this->hasMany(Valoraciones::class, 'idAviso');
}

Al momento de consultar los avisos lo pueden hacer con:

$avisos = Avisos::with('valoraciones')->get();

La esto debería añadir a cada aviso sus valoraciones.

1
  • 1
    Excelente, gracias por tu respuesta!
    – David081
    Commented el 18 jul. 2022 a las 11:28

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.