Создание подзапроса с sequelize для фильтрации предстоящих событий по дате и времени - PullRequest
0 голосов
/ 27 мая 2018

кто знает, как запросить предстоящее событие, используя sequelize?Мне нужна ситуация, когда после начала события (Event date >= today's date AND event time >= today's time) оно удаляется из столбца «предстоящие события», которое я пробовал

db.Event.findAll({
     where: {
        [db.Sequelize.Op.and]: [{ isPrivate: false },
            { startdate: { $gte: new Date().toLocaleDateString() } },
            { starttime: { $gt: new Date().toLocaleTimeString('en-GB') } }
        ]
     }, 
     include: [{
       model: db.Center,
       attributes: ['id', 'name', 'location']
     }],
     order: [
       ['startdate', 'ASC'],
       ['starttime', 'ASC']
     ]
})
    .then((events) => {
     res.status(200).json({
         success: 'ok',
         data: events
    });
})
  .catch((err) => {
    res.status(500).json({
      message: err.message || 'Internal server error',
    });
});

, но оно не работает, и мне сказали, почему оно не 'т работа.Мне нужен способ отфильтровать время, когда (startdate >= new Date().toLocaleDateString()).Я тщетно пытался выяснить, как это работает.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 10 июня 2018
const dateOfToday = new Date();
const timeOfToday = moment().format('HH:mm:ss');

const daysEqualToToday = db.Event.findAll({
  where: {
    startdate: { $eq: dateOfToday },
  },
  include: [{
    model: db.Center,
    attributes: ['id', 'name', 'location']
  }],
  order: [
    ['startdate', 'ASC'],
    ['starttime', 'ASC']
  ]
})
  .then(events =>
    events.filter(event => event.starttime > timeOfToday));


const daysGreaterThanToday = db.Event.findAll({
  where: {
    startdate: { $gt: dateOfToday },
  },
  include: [{
    model: db.Center,
    attributes: ['id', 'name', 'location']
  }],
  order: [
    ['startdate', 'ASC'],
    ['starttime', 'ASC']
  ]
});


Promise
  .all([daysEqualToToday, daysGreaterThanToday])
  .then((results) => {
    const combinedResult = [].concat(...results);
    res.status(200).json({
      success: 'ok',
      data: combinedResult
    });
  })
  .catch((err) => {
    res.status(500).json({
      message: err.message || 'Internal server error',
    });
  });
 }

Итак, я не смог использовать подзапрос сиквела для решения моей проблемы.Я получил предложение (не из stackoverflow), чтобы сохранить мои даты как datetime в базе данных и использовать его для сравнения datetime, непосредственно запрашивающих базу данных дважды.Я отказался от этого, потому что чувствовал, что это не очень удобно для пользователя.

В конце концов я решил пойти не на идеальное решение.Сначала выполните два запроса к базе данных: создайте запрос, когда начальная дата совпадает с сегодняшней датой, а затем отфильтруйте время начала, чтобы найти время начала, превышающее текущее время.

второй: сделать запрос, когдадата начала больше сегодняшней даты.

Затем я использовал Promise.all для разрешения обоих запросов.Как я уже сказал, решение не является идеальным, так как я делаю два вызова в базу данных, но я пойду с ним сейчас.Я буду признателен за лучшие способы реализации этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...