How to control the inner join query in sequelize using node.js?












2














Days model:



dayNumber: {
type: Sequelize.INTEGER,
primaryKey: true
},
dayDate: {
type: Sequelize.DATE
},
status: {
type: Sequelize.INTEGER
},
traineeId: {
type: Sequelize.INTEGER,
primaryKey: true
},
workoutId: {
type: Sequelize.INTEGER,
}


WorkoutsExercises model:



exercise_name: {
type: Sequelize.INTEGER,
primaryKey: true
},
workout_id: {
type: Sequelize.DATE,
primaryKey: true
},
coach_id: {
type: Sequelize.INTEGER,
primaryKey: true
}


I just want to make an inner join between the two tables to return all exercises in each day, I use the following



const Days = require('../models/days');
const WorkoutsExercises = require('../models/workoutsExercises');

Days.findAll({
include: [{
model: WorkoutsExercises,
required: true
}]
})


And this function returns the following query:



SELECT
`day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`, `day`.`workoutId`,
`workoutsExercises`.`exercise_name` AS `workoutsExercises.exercise_name`,
`workoutsExercises`.`workout_id` AS `workoutsExercises.workout_id`,
`workoutsExercises`.`coach_id` AS `workoutsExercises.coach_id`
FROM `days` AS `day`
INNER JOIN `workoutsExercises` AS `workoutsExercises` ON `day`.`dayNumber` = `workoutsExercises`.`workout_id`;


how can I change the on condition from (day.dayNumber) to (day.workoutId)










share|improve this question



























    2














    Days model:



    dayNumber: {
    type: Sequelize.INTEGER,
    primaryKey: true
    },
    dayDate: {
    type: Sequelize.DATE
    },
    status: {
    type: Sequelize.INTEGER
    },
    traineeId: {
    type: Sequelize.INTEGER,
    primaryKey: true
    },
    workoutId: {
    type: Sequelize.INTEGER,
    }


    WorkoutsExercises model:



    exercise_name: {
    type: Sequelize.INTEGER,
    primaryKey: true
    },
    workout_id: {
    type: Sequelize.DATE,
    primaryKey: true
    },
    coach_id: {
    type: Sequelize.INTEGER,
    primaryKey: true
    }


    I just want to make an inner join between the two tables to return all exercises in each day, I use the following



    const Days = require('../models/days');
    const WorkoutsExercises = require('../models/workoutsExercises');

    Days.findAll({
    include: [{
    model: WorkoutsExercises,
    required: true
    }]
    })


    And this function returns the following query:



    SELECT
    `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`, `day`.`workoutId`,
    `workoutsExercises`.`exercise_name` AS `workoutsExercises.exercise_name`,
    `workoutsExercises`.`workout_id` AS `workoutsExercises.workout_id`,
    `workoutsExercises`.`coach_id` AS `workoutsExercises.coach_id`
    FROM `days` AS `day`
    INNER JOIN `workoutsExercises` AS `workoutsExercises` ON `day`.`dayNumber` = `workoutsExercises`.`workout_id`;


    how can I change the on condition from (day.dayNumber) to (day.workoutId)










    share|improve this question

























      2












      2








      2


      1





      Days model:



      dayNumber: {
      type: Sequelize.INTEGER,
      primaryKey: true
      },
      dayDate: {
      type: Sequelize.DATE
      },
      status: {
      type: Sequelize.INTEGER
      },
      traineeId: {
      type: Sequelize.INTEGER,
      primaryKey: true
      },
      workoutId: {
      type: Sequelize.INTEGER,
      }


      WorkoutsExercises model:



      exercise_name: {
      type: Sequelize.INTEGER,
      primaryKey: true
      },
      workout_id: {
      type: Sequelize.DATE,
      primaryKey: true
      },
      coach_id: {
      type: Sequelize.INTEGER,
      primaryKey: true
      }


      I just want to make an inner join between the two tables to return all exercises in each day, I use the following



      const Days = require('../models/days');
      const WorkoutsExercises = require('../models/workoutsExercises');

      Days.findAll({
      include: [{
      model: WorkoutsExercises,
      required: true
      }]
      })


      And this function returns the following query:



      SELECT
      `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`, `day`.`workoutId`,
      `workoutsExercises`.`exercise_name` AS `workoutsExercises.exercise_name`,
      `workoutsExercises`.`workout_id` AS `workoutsExercises.workout_id`,
      `workoutsExercises`.`coach_id` AS `workoutsExercises.coach_id`
      FROM `days` AS `day`
      INNER JOIN `workoutsExercises` AS `workoutsExercises` ON `day`.`dayNumber` = `workoutsExercises`.`workout_id`;


      how can I change the on condition from (day.dayNumber) to (day.workoutId)










      share|improve this question













      Days model:



      dayNumber: {
      type: Sequelize.INTEGER,
      primaryKey: true
      },
      dayDate: {
      type: Sequelize.DATE
      },
      status: {
      type: Sequelize.INTEGER
      },
      traineeId: {
      type: Sequelize.INTEGER,
      primaryKey: true
      },
      workoutId: {
      type: Sequelize.INTEGER,
      }


      WorkoutsExercises model:



      exercise_name: {
      type: Sequelize.INTEGER,
      primaryKey: true
      },
      workout_id: {
      type: Sequelize.DATE,
      primaryKey: true
      },
      coach_id: {
      type: Sequelize.INTEGER,
      primaryKey: true
      }


      I just want to make an inner join between the two tables to return all exercises in each day, I use the following



      const Days = require('../models/days');
      const WorkoutsExercises = require('../models/workoutsExercises');

      Days.findAll({
      include: [{
      model: WorkoutsExercises,
      required: true
      }]
      })


      And this function returns the following query:



      SELECT
      `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`, `day`.`workoutId`,
      `workoutsExercises`.`exercise_name` AS `workoutsExercises.exercise_name`,
      `workoutsExercises`.`workout_id` AS `workoutsExercises.workout_id`,
      `workoutsExercises`.`coach_id` AS `workoutsExercises.coach_id`
      FROM `days` AS `day`
      INNER JOIN `workoutsExercises` AS `workoutsExercises` ON `day`.`dayNumber` = `workoutsExercises`.`workout_id`;


      how can I change the on condition from (day.dayNumber) to (day.workoutId)







      node.js join sequelize.js inner-join






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 19 '18 at 19:37









      Ebrahim AmerEbrahim Amer

      337




      337
























          2 Answers
          2






          active

          oldest

          votes


















          1














          The relation should be as the following



          WorkoutExercises.hasMany(Day, {foreignKey: 'workout_id'})
          Day.belongsTo(WorkoutExercises, {foreignKey: 'workout_id', targetKey: 'workout_id'})


          the target key is what changes the ON clause, the query will be:



          Days.findAll({
          include: [{
          model: WorkoutsExercises,
          required: true
          }]
          })


          which gives:



          SELECT

          `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`,
          `day`.`workoutId`,


          workoutsExercises.exercise_name AS
          workoutsExercises.exercise_name, workoutsExercises.workout_id AS
          workoutsExercises.workout_id, workoutsExercises.coach_id AS
          workoutsExercises.coach_id



           FROM `days` AS `day`

          INNER JOIN `workoutsExercises` AS `workoutsExercises` ON
          `day`.`workout_id` = `workoutsExercises`.`workout_id`;





          share|improve this answer





























            0
















            1. If you have several relations between two models you can create several associations:



              User.hasMany(Task);
              Task.belongsTo(User);

              User.hasMany(Task, {as: "secondAssociation", foreignKey, sourceKey});
              Task.belongsTo(User, {as: "secondAssociation", foreignKey, targetKey});


              And you can run this queries with different ON clause, determined by foreignKey (and sourceKey/targetKey) value, that you provide to create associations:



              User.findAll({
              include: [{
              model: Task
              }]

              User.findAll({
              include: [{
              model: Task,
              as: "secondAssociation"
              }]
              })



            2. If you want change ON clause for given query, you can use include.on option of Model.findAll method.



              User.findAll({
              include: [{
              model: Task,
              on: {} //Use Sequelize.Op.col for reference on other column
              }]







            share|improve this answer





















              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381495%2fhow-to-control-the-inner-join-query-in-sequelize-using-node-js%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              The relation should be as the following



              WorkoutExercises.hasMany(Day, {foreignKey: 'workout_id'})
              Day.belongsTo(WorkoutExercises, {foreignKey: 'workout_id', targetKey: 'workout_id'})


              the target key is what changes the ON clause, the query will be:



              Days.findAll({
              include: [{
              model: WorkoutsExercises,
              required: true
              }]
              })


              which gives:



              SELECT

              `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`,
              `day`.`workoutId`,


              workoutsExercises.exercise_name AS
              workoutsExercises.exercise_name, workoutsExercises.workout_id AS
              workoutsExercises.workout_id, workoutsExercises.coach_id AS
              workoutsExercises.coach_id



               FROM `days` AS `day`

              INNER JOIN `workoutsExercises` AS `workoutsExercises` ON
              `day`.`workout_id` = `workoutsExercises`.`workout_id`;





              share|improve this answer


























                1














                The relation should be as the following



                WorkoutExercises.hasMany(Day, {foreignKey: 'workout_id'})
                Day.belongsTo(WorkoutExercises, {foreignKey: 'workout_id', targetKey: 'workout_id'})


                the target key is what changes the ON clause, the query will be:



                Days.findAll({
                include: [{
                model: WorkoutsExercises,
                required: true
                }]
                })


                which gives:



                SELECT

                `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`,
                `day`.`workoutId`,


                workoutsExercises.exercise_name AS
                workoutsExercises.exercise_name, workoutsExercises.workout_id AS
                workoutsExercises.workout_id, workoutsExercises.coach_id AS
                workoutsExercises.coach_id



                 FROM `days` AS `day`

                INNER JOIN `workoutsExercises` AS `workoutsExercises` ON
                `day`.`workout_id` = `workoutsExercises`.`workout_id`;





                share|improve this answer
























                  1












                  1








                  1






                  The relation should be as the following



                  WorkoutExercises.hasMany(Day, {foreignKey: 'workout_id'})
                  Day.belongsTo(WorkoutExercises, {foreignKey: 'workout_id', targetKey: 'workout_id'})


                  the target key is what changes the ON clause, the query will be:



                  Days.findAll({
                  include: [{
                  model: WorkoutsExercises,
                  required: true
                  }]
                  })


                  which gives:



                  SELECT

                  `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`,
                  `day`.`workoutId`,


                  workoutsExercises.exercise_name AS
                  workoutsExercises.exercise_name, workoutsExercises.workout_id AS
                  workoutsExercises.workout_id, workoutsExercises.coach_id AS
                  workoutsExercises.coach_id



                   FROM `days` AS `day`

                  INNER JOIN `workoutsExercises` AS `workoutsExercises` ON
                  `day`.`workout_id` = `workoutsExercises`.`workout_id`;





                  share|improve this answer












                  The relation should be as the following



                  WorkoutExercises.hasMany(Day, {foreignKey: 'workout_id'})
                  Day.belongsTo(WorkoutExercises, {foreignKey: 'workout_id', targetKey: 'workout_id'})


                  the target key is what changes the ON clause, the query will be:



                  Days.findAll({
                  include: [{
                  model: WorkoutsExercises,
                  required: true
                  }]
                  })


                  which gives:



                  SELECT

                  `day`.`dayNumber`, `day`.`dayDate`,`day`.`status`, `day`.`traineeId`,
                  `day`.`workoutId`,


                  workoutsExercises.exercise_name AS
                  workoutsExercises.exercise_name, workoutsExercises.workout_id AS
                  workoutsExercises.workout_id, workoutsExercises.coach_id AS
                  workoutsExercises.coach_id



                   FROM `days` AS `day`

                  INNER JOIN `workoutsExercises` AS `workoutsExercises` ON
                  `day`.`workout_id` = `workoutsExercises`.`workout_id`;






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 2 '18 at 20:22









                  Ebrahim AmerEbrahim Amer

                  337




                  337

























                      0
















                      1. If you have several relations between two models you can create several associations:



                        User.hasMany(Task);
                        Task.belongsTo(User);

                        User.hasMany(Task, {as: "secondAssociation", foreignKey, sourceKey});
                        Task.belongsTo(User, {as: "secondAssociation", foreignKey, targetKey});


                        And you can run this queries with different ON clause, determined by foreignKey (and sourceKey/targetKey) value, that you provide to create associations:



                        User.findAll({
                        include: [{
                        model: Task
                        }]

                        User.findAll({
                        include: [{
                        model: Task,
                        as: "secondAssociation"
                        }]
                        })



                      2. If you want change ON clause for given query, you can use include.on option of Model.findAll method.



                        User.findAll({
                        include: [{
                        model: Task,
                        on: {} //Use Sequelize.Op.col for reference on other column
                        }]







                      share|improve this answer


























                        0
















                        1. If you have several relations between two models you can create several associations:



                          User.hasMany(Task);
                          Task.belongsTo(User);

                          User.hasMany(Task, {as: "secondAssociation", foreignKey, sourceKey});
                          Task.belongsTo(User, {as: "secondAssociation", foreignKey, targetKey});


                          And you can run this queries with different ON clause, determined by foreignKey (and sourceKey/targetKey) value, that you provide to create associations:



                          User.findAll({
                          include: [{
                          model: Task
                          }]

                          User.findAll({
                          include: [{
                          model: Task,
                          as: "secondAssociation"
                          }]
                          })



                        2. If you want change ON clause for given query, you can use include.on option of Model.findAll method.



                          User.findAll({
                          include: [{
                          model: Task,
                          on: {} //Use Sequelize.Op.col for reference on other column
                          }]







                        share|improve this answer
























                          0












                          0








                          0








                          1. If you have several relations between two models you can create several associations:



                            User.hasMany(Task);
                            Task.belongsTo(User);

                            User.hasMany(Task, {as: "secondAssociation", foreignKey, sourceKey});
                            Task.belongsTo(User, {as: "secondAssociation", foreignKey, targetKey});


                            And you can run this queries with different ON clause, determined by foreignKey (and sourceKey/targetKey) value, that you provide to create associations:



                            User.findAll({
                            include: [{
                            model: Task
                            }]

                            User.findAll({
                            include: [{
                            model: Task,
                            as: "secondAssociation"
                            }]
                            })



                          2. If you want change ON clause for given query, you can use include.on option of Model.findAll method.



                            User.findAll({
                            include: [{
                            model: Task,
                            on: {} //Use Sequelize.Op.col for reference on other column
                            }]







                          share|improve this answer














                          1. If you have several relations between two models you can create several associations:



                            User.hasMany(Task);
                            Task.belongsTo(User);

                            User.hasMany(Task, {as: "secondAssociation", foreignKey, sourceKey});
                            Task.belongsTo(User, {as: "secondAssociation", foreignKey, targetKey});


                            And you can run this queries with different ON clause, determined by foreignKey (and sourceKey/targetKey) value, that you provide to create associations:



                            User.findAll({
                            include: [{
                            model: Task
                            }]

                            User.findAll({
                            include: [{
                            model: Task,
                            as: "secondAssociation"
                            }]
                            })



                          2. If you want change ON clause for given query, you can use include.on option of Model.findAll method.



                            User.findAll({
                            include: [{
                            model: Task,
                            on: {} //Use Sequelize.Op.col for reference on other column
                            }]








                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 30 '18 at 21:00









                          FarisFaris

                          1014




                          1014






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.





                              Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                              Please pay close attention to the following guidance:


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381495%2fhow-to-control-the-inner-join-query-in-sequelize-using-node-js%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              MongoDB - Not Authorized To Execute Command

                              in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

                              Npm cannot find a required file even through it is in the searched directory