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:
Espero esto le pueda ser de utilidad a alguien más.
Judlup
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