我用的是续集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查询?
5条答案
按热度按时间zbsbpyhn1#
虽然公认的答案在技术上没有错,但它没有回答最初的问题,也没有回答评论中的后续问题,这正是我来这里寻找的。
如果你想找到所有有用户的帖子(并且只有那些有用户的帖子),SQL应该是这样的:
这在语义上与OP的原始SQL相同:
那这就是你想要的
将required设置为true是生成内部连接的关键。如果你想要左外部连接(在这里你可以获取所有帖子,而不管是否有用户链接),那么将required设置为false,或者将其保留,因为这是默认设置:
如果您想查找属于出生年份在1984年的用户的所有帖子,您需要:
请注意,只要在中添加where子句,required就默认为true。
如果你想要所有的帖子,不管是否有一个用户连接,但如果有一个用户,那么只有那些出生在1984年,然后添加所需的字段回到:
如果您希望所有帖子的名称都是“Sunshine”,并且只有它属于1984年出生的用户,您可以这样做:
如果您想要名称为“Sunshine”的所有帖子,并且仅当该帖子属于与帖子上的post_year属性在同一年出生的用户时,您可以执行以下操作:
我知道,这是没有道理的,有人会作出后,他们出生的一年,但这只是一个例子-去吧。:)
我从这个文档中(大部分)了解到了这一点:
dgiusagp2#
这会给你
与您发布的查询相比,上面的查询可能看起来有点复杂,但它所做的基本上只是为users表的所有列设置别名,以确保它们在返回时被放置到正确的模型中,而不会与posts模型混淆
除此之外,您会注意到它执行了JOIN操作,而不是从两个表中进行选择,但结果应该是相同的
进一步阅读:
rjzwgtxy3#
9avjhtql4#
在我的情况下,我做了以下事情。在UserMaster中,userId是PK,在UserAccess中,userId是UserMaster的FK
vjrehmav5#
在模型文件中创建关联,然后使用include进行联接,您可以使用inner include来联接表。
----model.js
-----controller.js