Distriartistas!

jueves, 16 de abril de 2020

Relación a una tabla Laravel (Lumen) - MongoDB

En estos días he estado trabajando en una aplicación la cual estoy realizando con Lumen y MondoDB Cloud, encontré esta librería para poder utilizar MongoDB con Eloquent (https://github.com/jenssegers/laravel-mongodb)  casi de manera transparente, al momento de relacionar los modelos, me ha dado bastante problema el poder lograrlo, más en el caso especifico en que lo que quiero realizar es relacionar dos llaves de la misma tabla para obtener los resultados, algo así:

Usuario              Ayuda
_id                     _id
usuario              ayuda_usuario_id
                          ayudado_usuario_id

Al momento de consultar Ayuda, debe traer los datos correspondientes a ayuda_usuario_id y ayudado_usuario_id, para esto con el modelo de relación hasOne no me ha funcionado, así que decidí buscar la manera de poder hacerlo raw.

Utilicé MongoDB Compass para generar la consulta mediante lookup y unwind, luego de tenerla busqué la manera de retornar la consulta y encontré el metodo raw en la librería, pero el problema era si quería filtrar los datos no me lo permitía, así que agrupé todo por arrays y he logrado entontrar la manera:

       
public function consultarPorUsuario($id)
  {
    
    return  Ayuda::raw(function ($collection) use ($id) {
       return $collection->aggregate(
        array(
          // Match
          array(
            '$match' => array("_id" => new ObjectID($id) )
          ),
          // Lookup ayuda
          array(
            '$lookup' => array(
              "as" => "ayuda",
              "from" => "usuario",
              "foreignField" => "_id",
              "localField" => "ayuda"
            )
          ),
          array( '$unwind' => array( 
            'path' => '$ayuda',
            ),
          ),
          // Lookup ayudado
          array(
            '$lookup' => array(
              "as" => "ayudado",
              "from" => "usuario",
              "foreignField" => "_id",
              "localField" => "ayudado"
            )
          ),
          array( '$unwind' => array( 
            'path' => '$ayudado',
            ),
          )
        )
      );
   });
    
  }

       
 

Espero esto le pueda ser de utilidad a alguien más.

Judlup

No hay comentarios:

Publicar un comentario