当前位置: 首页 > 面试题库 >

如何在Node.js上使用Sequelize进行联接查询

诸经略
2023-03-14
问题内容

我正在使用sequelize ORM;一切都很好,很干净,但是当我将其与html" target="_blank">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);
})

我想要一个查询,该查询以发布该信息的用户作为响应。在原始查询中,我得到以下信息:

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

我的问题是如何更改代码以使用ORM样式而不是SQL查询?


问题答案:
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`;

与您发布的内容相比,上面的查询可能看起来有些复杂,但是它所做的基本上只是为用户表的所有列添加别名,以确保在返回时将它们放置在正确的模型中,而不与发布模型混淆

除此之外,您还会注意到它执行JOIN而不是从两个表中进行选择,但是结果应该是相同的

进一步阅读:

  • http://docs.sequelizejs.com/zh-CN/latest/docs/associations/#one-to-one-associations
  • http://docs.sequelizejs.com/zh-CN/latest/docs/associations/#one-to-many-associations
  • http://docs.sequelizejs.com/zh-CN/latest/docs/models-usage/#eager-loading


 类似资料:
  • 我正在使用sequelize ORM;一切都很好,很干净,但是当我将它用于查询时遇到了一个问题。我有两个模型:用户和帖子。 我想要一个查询响应与用户的信息,使它的帖子。在原始查询中,我得到这个: 我的问题是如何更改代码以使用ORM样式而不是SQL查询?

  • 我正在尝试删除与表中一行相关联的行,而不删除主行(因此不能使用级联)。 这是一个原始的PostgreSQL查询,它实现了我想用SQL实现的功能。sequelize是否能够生成这样查询: 模型是(不包括不相关的列): 关联在SEQELIZE中定义为: 查询的另一个版本可以是: 但我认为sequelize还不能处理子查询? 我尝试了一些类似的方法: 然而,后遗症抱怨道: 错误:Model.Destro

  • 问题内容: 我想用UNION和limit进行查询。 我可以在mysql上解释该查询。 我在Elasticsearch上尝试过 http:// localhost:9200 / test / table / _search?pretty&source = {%22query%22:{%22dis_max%22:{%22queries%22:[{%22query%22:{%22match%22:{%2

  • 我试图在querydsl中匹配这个SQL查询 我知道如果联接到标识列中,如何进行左联接查询,但如果联接到两个可选列,则很难使其工作。tr.REQ_USERID和ab.USER_ID不是标识列 这是我的querydsl: 这将引发错误: 加入的预期路径![选择tripReq从com.TripReqtripReq左加入ADDR_BOOKaddressBook withtripReq.requestor

  • 现在,如果有3个表涉及这样的东西,我希望这样做。 我的问题基本上是...是否可以在语句上执行3个表联接?正确的语法是什么?谢谢你。我做...

  • 本文向大家介绍如何在Docker上使用OVS Bridge进行联网?,包括了如何在Docker上使用OVS Bridge进行联网?的使用技巧和注意事项,需要的朋友参考一下 OVS桥接器或Open vSwitch桥接器被用作Linux中本机桥接器的替代。它支持物理交换机中的大多数功能,同时还支持单个网桥上的多个vLAN。它也被广泛用于Docker网络中,因为与本地网桥相比,它被证明对多主机网络很有用