【问题标题】:How to do a LEFT JOIN in Sequelize with more than one predicate in the ON clause?如何在 ON 子句中使用多个谓词在 Sequelize 中进行 LEFT JOIN?
【发布时间】:2015-01-11 20:09:14
【问题描述】:

这是我非常简单的 Sequelize 模型关系:

    models["Post"]
        .hasMany(models["PostLike"])
    models["PostLike"]
        .belongsTo(models["Post"])

这是我的 Sequelize.findAll 查询(用 CoffeeScript 编写):

Post.findAll
            include : [ PostLike ]
            where : where
            offset : start
            limit : limit
            order : order
.success (posts) =>
     ......
.failure (error) =>
     ......

如您所见,我包含 PostLike 模型,Sequelize 生成正确的 LEFT JOIN:

...FROM "posts" LEFT JOIN "post_likes" AS "post_likes" 
    ON "posts"."id" = "posts_likes"."post_id" ...

但是,我想让 Sequelize 使用我的自定义条件扩展 ON 谓词:

... ON "posts"."id" = "posts_likes"."post_id" AND posts_likes.author_id = 123

这可能很容易做到,我只是在文档中找不到。

谢谢

【问题讨论】:

  • 你可以在sequelize中执行sql查询。

标签: node.js postgresql orm sequelize.js


【解决方案1】:

请原谅缺少 CoffeeScript,但您可以这样做:

Post.findAll({
    include: [{
        model: PostLike,
        where: { author_id: 123 }
    }]
})

我在代码中发现以下 cmets 也可能有用。

* @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

【讨论】:

  • 注意“急切加载到内部连接,除非您明确设置required: false”有很大帮助。谢谢!
猜你喜欢
  • 2022-01-23
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多