Muljayan
Muljayan

Reputation: 3886

Passing associated table attributes as main table attributes in sequelize

I have a query which is similar to the following.

const TODAY = new Date().setHours(0, 0, 0, 0);
const studentAttendances = await STUDENT_ATTENDANCES.findAll({
  where: {
    punch_in: { [Op.gt]: TODAY },
  },
  attributes: ['id', 'student_id', 'arrived_time'],
  include: [
    {
      model: STUDENTS,
      attributes: ['name'],
    },
  ],
  raw: true,
  nest: true,
});

The current output given is an array of objects which look like the following.

 {
        "id": 1041,
        "student_id": 16,
        "arrived_time": "2019-05-29T08:29:41.000Z",
        "student": {
            "name": "Tom"
        }
    },

Instead of having a nested object as above how do i make the student name itself be an attribute of the main object ? Example as follows.

   {
        "id": 1041,
        "student_id": 16,
        "arrived_time": "2019-05-29T08:29:41.000Z",
        "student": "Tom"
    },

I hope to do this through sequelize without using any JS loops

Upvotes: 0

Views: 1248

Answers (2)

type
type

Reputation: 416

Something like this should work, assuming your singular model name is "Student":

 const studentAttendances = await STUDENT_ATTENDANCES.findAll({
  where: {
    punch_in: { [Op.gt]: TODAY },
  },
  attributes: [
    [sequelize.col('Student.name'), 'studentName'], // will give you name as 'studentName'
    'id', 'student_id', 'arrived_time'
  ],
  include: [
    {
      model: STUDENTS,
      attributes: [], // empty this out 
    },
  ]
});

Upvotes: 1

Mahdi
Mahdi

Reputation: 1405

I think you can handle it with pure javascript :

studentAttendances = studentAttendances.get({plain: true})

for(student in studentAttendances){
  studentAttendances[student].student = studentAttendances[student].student.name
}

Upvotes: 0

Related Questions