当前位置: 首页 > 知识库问答 >
问题:

如何在节点上使用Sequelize进行连接查询。js

苗康平
2023-03-14

我正在使用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);
})

我想要一个查询响应与用户的信息,使它的帖子。在原始查询中,我得到这个:

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

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

共有3个答案

隆芷阳
2023-03-14
Model1.belongsTo(Model2, { as: 'alias' })

Model1.findAll({include: [{model: Model2  , as: 'alias'  }]},{raw: true}).success(onSuccess).error(onError);
谷梁迪
2023-03-14
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`;

与您发布的内容相比,上面的查询可能看起来有点复杂,但它所做的基本上只是对users表的所有列进行别名处理,以确保它们在返回时被放置到正确的模型中,而不是与posts模型混淆

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

进一步阅读:

  • http://docs.sequelizejs.com/en/latest/docs/associations/#one-到一个协会
  • http://docs.sequelizejs.com/en/latest/docs/associations/#one-许多协会
  • http://docs.sequelizejs.com/en/latest/docs/models-usage/#eager-装载
卫弘图
2023-03-14

虽然被接受的答案在技术上没有错误,但它没有回答评论中的原始问题和后续问题,这也是我来这里寻找的。但我想通了,就这样。

如果要查找所有包含用户的帖子(并且仅包含用户的帖子),其中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 => {
  /* ... */
});

将required设置为true是生成内部联接的关键。如果您想要左外部联接(无论是否有用户链接,您都可以从中获得所有帖子),则将required更改为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。

如果你想要所有的帖子,不管是否有用户,但是如果有用户,那么只需要1984年出生的用户,然后将所需的字段添加回:

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

如果您希望所有帖子的名称都是“Sunshine”,并且仅当它属于1984年出生的用户时,您可以这样做:

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

如果你想要所有名称为“阳光”的帖子,并且只有当它属于同年出生的用户,并且与帖子上的post_year属性相匹配,你可以这样做:

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

我知道,有人会在出生的那一年发帖子是没有意义的,但这只是个例子——随它去吧。:)

我(主要)从这份文件中得出了这个结论:

  • http://docs.sequelizejs.com/en/latest/docs/models-usage/#eager-loading
 类似资料:
  • 问题内容: 我正在使用sequelize ORM;一切都很好,很干净,但是当我将其与查询一起使用时遇到了问题。我有两种模式:用户和帖子。 我想要一个查询,该查询以发布该信息的用户作为响应。在原始查询中,我得到以下信息: 我的问题是如何更改代码以使用ORM样式而不是SQL查询? 问题答案: 哪个会给你 与您发布的内容相比,上面的查询可能看起来有些复杂,但是它所做的基本上只是为用户表的所有列添加别名,

  • Server.js文件: 使用者用于猫鼬模型的js: 用于在mongodb数据库中插入我的数据的Web服务: Mongo DB崩溃,最后一次输入日志文件显示2017-09-18T07:39:36.249 0000 I网络[initandlisten]连接已从127.0.0.1:57774#115(115个连接现已打开)接受。我正在使用节点mongoose及其连接方法。我不知道如何解决这个问题,如果

  • 如何在Flink SQL查询中使用SQL客户端进行窗口连接。窗口设置方式与下面链接中提到的方式相同https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/joining.html 需要窗口的示例查询:选择sourceKafka.*从sourceKafka内部连接SourceKafca上的bad

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

  • 问题内容: 我正在尝试使用 Java 和 Elasticsearch 进行Elasticsearch搜索。elasticsearch为Java提供了API,这很酷。 问题是,我希望在Java中创建一个方法,该方法接收一个字符串(应该是一个包含用于搜索的信息的JSON),该字符串反映此对Elasticsearch的HTTP调用 但是我希望这种方法尽可能通用。 所以问题是: 是否可以使用Java AP

  • 问题内容: 我们有以下关系: 一个人可以有许多电子邮件地址 电子邮件服务提供商可以(显然)可以提供多个电子邮件地址 因此,这是多对多的关系。我有三个表:电子邮件,提供者和用户。电子邮件具有两个外部ID,分别用于提供商和用户。 现在,给定一个特定的人,我想打印所有电子邮件提供者及其为该人托管的电子邮件地址(如果存在)。(如果该人在Gmail上没有电子邮件,我仍然希望在结果中使用Gmail。我相信否则