postgresql 如何在 ON 子句中使用多个谓词在 Sequelize 中执行 LEFT JOIN?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26929911/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to do a LEFT JOIN in Sequelize with more than one predicate in the ON clause?
提问by lazlojuly
This is my very simple Sequelize model relation:
这是我非常简单的 Sequelize 模型关系:
models["Post"]
.hasMany(models["PostLike"])
models["PostLike"]
.belongsTo(models["Post"])
and this is my Sequelize.findAll query (written in CoffeeScript):
这是我的 Sequelize.findAll 查询(用 CoffeeScript 编写):
Post.findAll
include : [ PostLike ]
where : where
offset : start
limit : limit
order : order
.success (posts) =>
......
.failure (error) =>
......
As you can see I include the PostLike model and Sequelize produces the correct LEFT JOIN:
如您所见,我包含了 PostLike 模型,Sequelize 生成了正确的 LEFT JOIN:
...FROM "posts" LEFT JOIN "post_likes" AS "post_likes"
ON "posts"."id" = "posts_likes"."post_id" ...
However, I would like to get Sequelize to extend the ON predicates with my custom criteria:
但是,我想让 Sequelize 使用我的自定义条件扩展 ON 谓词:
... ON "posts"."id" = "posts_likes"."post_id" AND posts_likes.author_id = 123
It might be something very easy to do, I just could not find it in the docs.
这可能很容易做到,我只是在文档中找不到它。
Thanks
谢谢
回答by Ben Fortune
Excuse the lack of CoffeeScript, but you could do something like:
请原谅缺少 CoffeeScript,但您可以执行以下操作:
Post.findAll({
include: [{
model: PostLike,
where: { author_id: 123 }
}]
})
I've found the following comments in the code which may also be of use.
我在代码中发现以下注释也可能有用。
* @param {Array<Object|Model>} [options.include] A list of associations to eagerly load using a left join. Supported is either `{ include: [ Model1, Model2, ...]}` or `{ include: [{ model: Model1, as: 'Alias' }]}`. If your association are set up with an `as` (eg. `X.hasMany(Y, { as: 'Z }`, you need to specify Z in the as attribute when eager loading Y).
* @param {Model} [options.include[].model] The model you want to eagerly load
* @param {String} [options.include[].as] The alias of the relation, in case the model you want to eagerly load is aliassed. For `hasOne` / `belongsTo`, this should be the singular name, and for `hasMany`, it should be the plural
* @param {Association} [options.include[].association] The association you want to eagerly load. (This can be used instead of providing a model/as pair)
* @param {Object} [options.include[].where] Where clauses to apply to the child models. Note that this converts the eager load to an inner join, unless you explicitly set `required: false`
* @param {Array<String>} [options.include[].attributes] A list of attributes to select from the child model
* @param {Boolean} [options.include[].required] If true, converts to an inner join, which means that the parent model will only be loaded if it has any matching children. True if `include.where` is set, false otherwise.
* @param {Array<Object|Model>} [options.include[].include] Load further nested related models