programing

Node.js에서 Sequelize를 사용하여 조인 쿼리를 만드는 방법

nicescript 2022. 9. 21. 22:18
반응형

Node.js에서 Sequelize를 사용하여 조인 쿼리를 만드는 방법

속편 ORM을 사용하고 있습니다.모든 것이 훌륭하고 깨끗합니다만, 그것을 사용할 때 문제가 있었습니다.join문의합니다.두 가지 모델이 있습니다.사용자와 투고입니다.

var User = db.seq.define('User',{
    username: { type: db.Sequelize.STRING},
    email: { type: db.Sequelize.STRING},
    password: { type: db.Sequelize.STRING},
    sex : { type: db.Sequelize.INTEGER},
    day_birth: { type: db.Sequelize.INTEGER},
    month_birth: { type: db.Sequelize.INTEGER},
    year_birth: { type: db.Sequelize.INTEGER}

});

User.sync().success(function(){
    console.log("table created")
}).error(function(error){
    console.log(err);
})


var Post = db.seq.define("Post",{
    body: { type: db.Sequelize.TEXT },
    user_id: { type: db.Sequelize.INTEGER},
    likes: { type: db.Sequelize.INTEGER, defaultValue: 0 },

});

Post.sync().success(function(){
    console.log("table created")
}).error(function(error){
    console.log(err);
})

작성한 사용자의 정보가 포함된 게시물로 응답하는 쿼리를 원합니다.raw 쿼리에서는 다음과 같이 표시됩니다.

db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
            res.json(rows);
        });

궁금한 점은 SQL 쿼리가 아닌 ORM 스타일을 사용하도록 코드를 변경하는 방법입니다.

받아들여진 답변이 기술적으로 틀린 것은 아니지만, 제가 찾고 있던 원래의 질문이나 댓글에 있는 후속 질문에는 답하지 않습니다.하지만 내가 알아냈으니, 시작해보지.

사용자가 있는 게시물(및 사용자가 있는 게시물만)을 모두 찾으려면 SQL이 다음과 같이 표시됩니다.

SELECT * FROM posts INNER JOIN users ON posts.user_id = users.id

이는 OP의 원래 SQL과 의미적으로 동일합니다.

SELECT * FROM posts, users WHERE posts.user_id = users.id

원하는 것은 다음과 같습니다.

Posts.findAll({
  include: [{
    model: User,
    required: true
   }]
}).then(posts => {
  /* ... */
});

true에 필요한 설정은 내부 조인 생성의 핵심입니다.왼쪽 외부 참여(사용자가 링크되어 있는지 여부에 관계없이 모든 POST를 얻을 수 있는 위치)를 원하는 경우 false로 변경하거나 기본값이므로 꺼둡니다.

Posts.findAll({
  include: [{
    model: User,
//  required: false
   }]
}).then(posts => {
  /* ... */
});

생년월일이 1984년인 사용자의 모든 게시물을 찾으려면 다음과 같이 하십시오.

Posts.findAll({
  include: [{
    model: User,
    where: {year_birth: 1984}
   }]
}).then(posts => {
  /* ... */
});

where 구를 추가하는 즉시 required는 기본적으로 true입니다.

사용자가 연결되어 있는지 여부에 관계없이 모든 Post를 원하는 경우 1984년생 Post만 다시 추가합니다.

Posts.findAll({
  include: [{
    model: User,
    where: {year_birth: 1984}
    required: false,
   }]
}).then(posts => {
  /* ... */
});

이름이 "Sunshine"인 모든 Posts를 1984년생 사용자 소유의 경우에만 다음 작업을 수행합니다.

Posts.findAll({
  where: {name: "Sunshine"},
  include: [{
    model: User,
    where: {year_birth: 1984}
   }]
}).then(posts => {
  /* ... */
});

이름이 "Sunshine"인 모든 게시물을 게시물의 post_year 속성과 일치하는 같은 해에 태어난 사용자의 경우에만 다음 작업을 수행합니다.

Posts.findAll({
  where: {name: "Sunshine"},
  include: [{
    model: User,
    where: ["year_birth = post_year"]
   }]
}).then(posts => {
  /* ... */
});

누군가가 자신이 태어난 해에 투고를 한다는 것은 말이 안 되지만, 그것은 단지 예시일 뿐입니다.그대로 하세요:)

저는 이 문서를 통해 (대부분) 이 사실을 알게 되었습니다.

User.hasMany(Post, {foreignKey: 'user_id'})
Post.belongsTo(User, {foreignKey: 'user_id'})

Post.find({ where: { ...}, include: [User]})

그럼 당신은

SELECT
  `posts`.*,
  `users`.`username` AS `users.username`, `users`.`email` AS `users.email`,
  `users`.`password` AS `users.password`, `users`.`sex` AS `users.sex`,
  `users`.`day_birth` AS `users.day_birth`,
  `users`.`month_birth` AS `users.month_birth`,
  `users`.`year_birth` AS `users.year_birth`, `users`.`id` AS `users.id`,
  `users`.`createdAt` AS `users.createdAt`,
  `users`.`updatedAt` AS `users.updatedAt`
FROM `posts`
  LEFT OUTER JOIN `users` AS `users` ON `users`.`id` = `posts`.`user_id`;

위의 쿼리는 투고 내용에 비해 다소 복잡해 보일 수 있지만 기본적으로 사용자 테이블의 모든 열에 앨리어스를 붙여 반환 시 올바른 모델에 배치하고 투고 모델과 혼재하지 않도록 합니다.

그 외에는 2개의 테이블에서 선택하는 대신 JOIN을 실행하지만 결과는 같아야 합니다.

추가 정보:

Model1.belongsTo(Model2, { as: 'alias' })

Model1.findAll({include: [{model: Model2  , as: 'alias'  }]},{raw: true}).success(onSuccess).error(onError);

제 경우엔 다음과 같은 일을 했습니다.UserMaster userId는 PK이고 UserAccess userId는 UserMaster의 FK입니다.

UserAccess.belongsTo(UserMaster,{foreignKey: 'userId'});
UserMaster.hasMany(UserAccess,{foreignKey : 'userId'});
var userData = await UserMaster.findAll({include: [UserAccess]});

언급URL : https://stackoverflow.com/questions/20460270/how-to-make-join-queries-using-sequelize-on-node-js

반응형