Search code examples
mongodblaravellumenjenssegers-mongodblumen-5.2

Use Mongo query in Lumen


I use jenssegers/laravel-mongodb package in my project. my project developed with Laravel Lumen micro framework, now how can i use blow mongo query with jenssegers/laravel-mongodb package in lumen

db.orders.aggregate([
{
    '$match': {
        'status': 'suspend'
    }
},
{
    '$project':{
        'min_diff': {
            '$ceil': {
                '$divide': [
                    {
                        '$subtract': [
                            new Date(),
                            '$created_at'
                        ]
                    },
                    60 * 1000
                ]
            }
        }
    }
},
{
    '$match': {
        '$or': [
            {
                'min_diff': {
                    '$gt': 5,
                    '$lte': 10
                },
                'latitude': {
                    '$gte': '{MIN_LAT}',
                    '$lte': '{MAX_LAT}'
                },
                'longitude': {
                    '$gte': '{MIN_LON}',
                    '$lte': '{MAX_LON}'
                }
            },
            {
                'min_diff': {
                    '$gt': 10,
                    '$lte': 15
                },
                'latitude': {
                    '$gte': '{MIN_LAT}',
                    '$lte': '{MAX_LAT}'
                },
                'longitude': {
                    '$gte': '{MIN_LON}',
                    '$lte': '{MAX_LON}'
                }
            }
        ]
    }
}
])

Notice : my Lumen version is 5.2 and MongoDB version is 3.2


Solution

  • I found this solution that works :

        $time_5_min_ago = Carbon::now()->subMinute(5);
        $time_10_min_ago = Carbon::now()->subMinute(10);
        $time_15_min_ago = Carbon::now()->subMinute(15);
        $time_20_min_ago = Carbon::now()->subMinute(20);
    
        return Order::where(function ($query)  use ($maxLat_try_one,$minLat_try_one,$maxLon_try_one,$minLon_try_one,$time_5_min_ago,$time_10_min_ago) {
            $query->whereBetween('source_longitude', [$minLon_try_one, $maxLon_try_one])
                ->whereBetween('source_latitude', [$minLat_try_one,$maxLat_try_one])
                ->where('status', '=', 'pending')
                ->where('created_at', '<', $time_5_min_ago)
                ->where('created_at', '>=', $time_10_min_ago);
        })->orWhere(function ($query)  use ($maxLat_try_two,$minLat_try_two,$maxLon_try_two,$minLon_try_two,$time_10_min_ago,$time_15_min_ago) {
            $query->whereBetween('source_longitude', [$minLon_try_two, $maxLon_try_two])
                ->whereBetween('source_latitude', [$minLat_try_two,$maxLat_try_two])
                ->where('status', '=', 'pending')
                ->where('created_at', '<', $time_10_min_ago)
                ->where('created_at', '>=', $time_15_min_ago);
        })->orWhere(function ($query)  use ($maxLat_try_three,$minLat_try_three,$maxLon_try_three,$minLon_try_three,$time_15_min_ago,$time_20_min_ago) {
            $query->whereBetween('source_longitude', [$minLon_try_three, $maxLon_try_three])
                ->whereBetween('source_latitude', [$minLat_try_three,$maxLat_try_three])
                ->where('status', '=', 'pending')
                ->where('created_at', '<', $time_15_min_ago)
                ->where('created_at', '>=', $time_20_min_ago);
        })->get($fields);