我正在使用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查询?
Model1.belongsTo(Model2, { as: 'alias' })
Model1.findAll({include: [{model: Model2 , as: 'alias' }]},{raw: true}).success(onSuccess).error(onError);
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模型混淆
除此之外,您会注意到它进行了连接,而不是从两个表中进行选择,但结果应该是相同的
进一步阅读:
虽然被接受的答案在技术上没有错误,但它没有回答评论中的原始问题和后续问题,这也是我来这里寻找的。但我想通了,就这样。
如果要查找所有包含用户的帖子(并且仅包含用户的帖子),其中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 => {
/* ... */
});
我知道,有人会在出生的那一年发帖子是没有意义的,但这只是个例子——随它去吧。:)
我(主要)从这份文件中得出了这个结论:
问题内容: 我正在使用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。我相信否则