Запрос Sequelize для идентификаторов, которые не существуют в массиве - PullRequest
0 голосов
/ 16 марта 2020

У меня есть две таблицы в базе данных. Один держит статус всадника c, или постоянный, график. Существует также таблица для временных изменений в расписании гонщика. Запрашивая расписание гонщика, я сначала проверяю временную таблицу на наличие записей с флагом «active», который соответствует идентификатору гонщика. Если он находит его, он проверяет, истекло ли время его «продолжительности». Если время истекло, он меняет активный флаг на false и возвращает график состояния всадника c. Если «длительность» временной записи не истекла, она возвращает это временное расписание. Если он вообще не находит временное расписание, он возвращает расписание состояния всадника c. это выглядит следующим образом:

exports.findOne = (req, res) => {
Temp.findOne({
    where:{
        riderId: req.params.riderId,
        active: true
    }
}).then(temp => {
    if(!temp){
        Riders.findOne({
            where:{
                id: req.params.riderId
            }
        }).then(rider => {
            res.send(rider)
        }).catch(err => {
            res.status(500).send(`Error -> ${err}`)
        })
    }else{
        let tempSchedule = temp.dataValues
        if(moment().isBefore(tempSchedule.duration)){
            res.send(temp)
        }else{
            Temp.update({
                active: false,
            },{
                where:{
                    id: tempSchedule.id
                }
            }).then(() => {
                res.send(req.body)
            }).catch(err => {
                res.status(500).send(`Error -> ${err}`)
            })
        }
    }
}).catch(err => {
    res.status(500).send(`Error -> ${err}`)
})
}

У меня проблема в том, что я делаю это в большем масштабе для всех райдера в базе данных. Мне нужно просмотреть все соответствующие графики гонщиков. Временные графики при необходимости, если не stati c расписания. Это моя попытка:

exports.findAll = (req, res) => {
Temp.findAll({
    where:{
        active: true
    }
}).then(temp => {
    if(!temp){
        Riders.findAll()
        .then(rider => {
            res.send(rider)
        }).catch(err => {
            res.status(500).send(`Error -> ${err}`)
        })
    }else{
        let valid = []
        temp.map((item) => {
            let tempSchedule = item.dataValues
           if(moment().isBefore(tempSchedule.duration)){
                valid.push(item)
            }else{
                Temp.update({
                    active: false,
                },{
                    where:{
                        id: tempSchedule.id
                    }
                }).then(() => {
                    return
                }).catch(err => {
                    res.status(500).send(`Error ->     ${err}`)
                })
            }
        })
        let id = valid.map((item) => item.id)
        Riders.findAll({
            where:{
            id: { $notIn: [...id] }
        }})
        .then(rider => {
            valid = [...valid, rider]
        }).catch(err => {
            res.status(500).send(`Error -> ${err}`)
        })
        res.send(valid)
    }
}).catch(err => {
    res.status(500).send(`Error -> ${err}`)
})
}

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

    let id = valid.map((item) => item.id)
    Riders.findAll({
           where:{
           id: { $notIn: [...id] }
     }})

Но он не добавляет в ответ ни одного из графиков состояния всадника c. Я получаю только гонщиков с временными графиками. Любые идеи? Это Sequelize $ notIn? Надеюсь, я вас не смутил так сильно, как смутил себя. Спасибо!

...