Запрос с диапазоном дат работает, когда выполняется непосредственно в Mongo, но не выполняется при использовании из Laravel

  • У меня есть две коллекции под названием promotions а также coupons
  • Купоны имеет promotion._id как ссылка на рекламную коллекцию.

Я хочу получить рекламные акции в диапазоне дат. Для этого у меня есть два поля valid_from а также apply_till,

"valid_from" : ISODate("2018-09-10T06:15:02.000Z"),
"apply_till" : ISODate("2018-10-20T06:15:02.000Z")

Этот прямой запрос MongoDb работает, когда выполняется напрямую:

db.getCollection('coupons').aggregate([
        {"$match":{"code":"PYDY25"}},
        {"$lookup":{"from":"promotions","localField":"promotion_id","foreignField":"_id","as":"promotion"}},
        {"$match":{
            "promotion.valid_from":{"$lte": ISODate("2018-09-12 06:31:30")},
            "promotion.apply_till":{"$gt": ISODate("2018-09-12 06:31:30")}
          }
        },
        {"$project":{"_id":0,"code":1,"promotion":1}}
    ])

Однако, когда я пытаюсь сделать то же самое через Laravel, это не работает. В запросе, сгенерированном Laravel, отсутствует форматирование ISODate (предоставлен сгенерированный запрос ниже).

В Ларавеле:

Модель продвижения имеет:

protected $dates = [
  'valid_from',
  'valid_till',
  'apply_till',
  'created_at',
  'updated_at'
];

Необработанный запрос, используемый для агрегирования в Laravel:

// Filter for code.
$aggregateBy[] = [
  '$match' => [
    'code' => $coupon->code
  ]
];

// JOINing table (promotion) for coupon table.
$aggregateBy[] = [
  '$lookup' => [
    'from' => 'promotions',
    'localField' => 'promotion_id',
    'foreignField' => '_id',
    'as' => 'promotion'
  ]
];

$aggregateBy[] = [
  '$unwind' => '$promotion'
];

$currentTime = Carbon::now()->format('Y-m-d\TH:i:s');
//$currentTime = new UTCDateTime((new \DateTime($currentTime))->getTimestamp());

$aggregateBy[] = [
  '$match' => [
   'promotion.valid_from' => [
      '$lte' => $currentTime,
    ],
    'promotion.apply_till' => [
      '$gt' => $currentTime,
    ]
  ]
];

// SELECT ed fields.
$aggregateBy[] = [
  '$project' => [
    '_id' => 0,
    'code' => 1,
    'promotion' => 1,
  ]
];

\DB::connection('mongodb')->enableQueryLog();

$couponPromotion = Coupon::raw(function ($collection) use ($aggregateBy) {
  return $collection->aggregate($aggregateBy);
});

\Log::info(\DB::connection('mongodb')->getQueryLog());

Когда я добавлю $match условие для promotion.valid_from и / или promotion.apply_till это не дает результата. Моя переменная $currentTime работает в Model::where() условия, но не работает здесь.

В журнале запрос сгенерирован как:

db.getCollection('coupons').aggregate([
    {"$match":{"code":"PYDY25"}},
    {"$lookup":{"from":"promotions","localField":"promotion_id","foreignField":"_id","as":"promotion"}},
    {"$match":{
        "promotion.valid_from":{"$lte":"2018-09-12 06:31:30"},
        "promotion.apply_till":{"$gt":"2018-09-12 06:31:30"}}
    },
    {"$project":{"_id":0,"code":1,"promotion":1}}
])

Как я могу пройти ISODate на сгенерированный запрос?

0 ответов

Другие вопросы по тегам