3 Вопрос: Sequelize: возвращает только один из множества результатов для вложенного включения

вопрос создан в Thu, May 2, 2019 12:00 AM

У меня есть 3 таблицы:

  1. вакансия
  2. фаза найма
  3. Интервью

Их ассоциация Работа имеет много этапов найма и На этапе набора есть много мест для собеседований

Я могу пройти все этапы приема на работу на должность, включив в нее объединение по фазе набора и групповое предложение.

const jobPosts = await JobPost.unscoped().findAll({
            where,
            include: [
            {
                model: db.RecruitmentPhase,
                include: [{
                    model: db.InterviewSlot,
                },

            ],
            group: ['RecruitmentPhases.id'],
        });

Но я получаю только одно место для собеседования на этапе набора персонала, хотя на этом этапе набора много мест для собеседования.

Я пытался сделать групповое предложение внутри include.

const jobPosts = await JobPost.unscoped().findAll({
                where,
                include: [
                {
                    model: db.RecruitmentPhase,
                    group: ['InterviewSlots.id'],
                    include: [{
                        model: db.InterviewSlot,
                    },

                ],
                group: ['RecruitmentPhases.id'],
            });

но он также дает только один интервал для интервью

ИЗМЕНИТЬ

модель должности:

module.exports = (sequelize, DataTypes) => {
    const jobPost = sequelize.define('JobPost', {
        id: {
            type: DataTypes.BIGINT,
            allowNull: true,
            autoIncrement: true,
            primaryKey: true,
        },
        jobTitle: {
            type: DataTypes.STRING(150),
            allowNull: true,
        },

    }, {
        timestamps: true,
        defaultScope: {
            attributes: { exclude: ['createdAt', 'updatedAt'] },
        },
    });
    jobPost.associate = (models) => {
        jobPost.hasMany(models.RecruitmentPhase);
    };
    return jobPost;
};

Модель фазы набора персонала:

module.exports = (sequelize, DataTypes) => {
    const recruitmentPhase = sequelize.define('RecruitmentPhase', {
        id: {
            type: DataTypes.BIGINT,
            allowNull: true,
            autoIncrement: true,
            primaryKey: true,
        },

        phaseName: {
            type: DataTypes.STRING(200),
            allowNull: true,
        },

    }, {
        timestamps: true,
    });
    recruitmentPhase.associate = (models) => {
        recruitmentPhase.belongsTo(models.JobPost);
        recruitmentPhase.hasMany(models.InterviewSlot);
    };
    return recruitmentPhase;
};

Модель слота для интервью:

module.exports = (sequelize, DataTypes) => {
    const interviewSlot = sequelize.define('InterviewSlot', {
        id: {
            type: DataTypes.BIGINT,
            allowNull: true,
            autoIncrement: true,
            primaryKey: true,
        },
        interviewDate: {
            type: DataTypes.DATE,
            allowNull: true,
        },
    });
    interviewSlot.associate = (models) => {
        interviewSlot.belongsTo(models.RecruitmentPhase);
    };
    return interviewSlot;
};
    
0
  1. Разместите свои модели для дальнейшего их анализа
    2019-05-02 17: 07: 26Z
  2. опубликовано. спасибо!
    2019-05-03 09: 22: 02Z
3 ответа                              3                         

Удалите group: ['RecruitmentPhases.id'],, чтобы увидеть подробности InterviewSlots. Как видите, вы видите сводку слотов для интервью ...

    
0
2019-05-02 17: 05: 29Z
  1. если я удалю ['RecruitmentPhases.id'], я не получу несколько этапов найма.
    2019-05-03 08: 47: 11Z

Итак, я не совсем уверен, это правильный ответ и правильный способ сделать это. Но когда я делаю группировку для этой вложенной таблицы 'интервью' с этим '-> , это сработало.

group: ['RecruitmentPhases.id', 'RecruitmentPhases->InterviewSlots.id'],
    
0
2019-05-03 08: 53: 51Z
  1. Можете ли вы отобразить данные, которые ожидаете увидеть в качестве результата вашего запроса?
    2019-05-03 21: 17: 45Z

Почему вы, кажется, получаете JobPost вместо RecruitmentPhase, если это то, что вы хотите получить из базы данных?

Из того, что я понимаю - вы ищете, чтобы получить все RecruitmentPhases с их должностью, сопровождающей InterviewSlots, выделенной для каждого RecruitmentPhase.

Возможный код: (Обновлено)

const rec = await db.RecruitmentPhase.findAll({
    include:[{model: db.JobPost, where:{ id:job_id }}, {model: db.InterviewSlot}]
});
res.json(rec)
//Expected JSON Data
{
  "RecruitmentPhase":[
    {
      "id":1,
      "phaseName":"Phase 1",
      "JobPosts": {
        "id":1,
        "jobTitle":"XYZ"
      },
      "InterviewSlots":[
        {//inteview slot #1 data},
        {//interview slot #2 data}
      ]
    },
    {
      "id":2,
      "phaseName":"Phase 2",
      "JobPosts": {
        "id":1,
        "jobTitle":"XYZ"
      },
      "InterviewSlots":[
        {//inteview slot #1 data},
        {//interview slot #2 data}
      ]
    }
  ]
}
    
- 1
2019-05-06 14: 03: 14Z
  1. У меня есть идентификатор должности. Откуда мне нужно получить все фазы набора для этой должности. И для каждой фазы набора мне нужно получить все фазы набора
    2019-05-06 09: 40: 16Z
  2. Понижение? Вам просто нужно добавить предложение where в запрос. Обновил ответ.
    2019-05-06 14: 05: 03Z
источник размещен Вот