【问题标题】:Ordering results of eager-loaded nested models in Node SequelizeNode Sequelize 中预加载嵌套模型的排序结果
【发布时间】:2015-07-11 18:31:39
【问题描述】:

我有一组复杂的关联模型。这些模型使用连接表关联,每个连接表都有一个名为“order”的属性。我需要能够查询父模型“页面”并包含关联模型,并按字段“顺序”对这些关联进行排序。

以下内容对结果的排序顺序没有影响:

db.Page.findAll({
  include: [{
    model: db.Gallery,
    order: ['order', 'DESC'],
    include: [{
      model: db.Artwork,
      order: ['order', 'DESC']
    }]
  }],
})

【问题讨论】:

  • 示例字段的命名令人讨厌。首先,两个模型都在同名字段上排序。该名称与操作相同。

标签: node.js postgresql sequelize.js


【解决方案1】:

我相信你可以做到:

db.Page.findAll({
  include: [{
    model: db.Gallery
    include: [{
      model: db.Artwork
    }]
  }],
  order: [
    // sort by the 'order' column in Gallery model, in descending order.

    [ db.Gallery, 'order', 'DESC' ], 


    // then sort by the 'order' column in the nested Artwork model in a descending order.
    // you need to specify the nested model's parent first.
    // in this case, the parent model is Gallery, and the nested model is Artwork

    [ db.Gallery, db.ArtWork, 'order', 'DESC' ]
  ]
})

还有很多不同的方式,或者您在订购时可以做的事情。在这里阅读更多:https://sequelize.org/master/manual/model-querying-basics.html#ordering-and-grouping

【讨论】:

  • 想想我去年一直在搞砸这个。
  • order: [ [db.Sequelize.col('order'), 'DESC'], // 对于页表 [ db.Gallery, 'order', 'DESC' ], [ db.画廊, db.ArtWork, 'order', 'DESC' ] ]
  • 我想吻你
  • 如果我想在页面内订购艺术品结果怎么办?在 Artwork 的包含中添加“顺序”似乎对包含结果的顺序没有任何影响
  • 谢谢,轻而易举!
【解决方案2】:

如果您还使用 'as' 并假设您想按 'createdDate' 订购,查询如下所示:

DbCategoryModel.findAll({
    include: [
        {
            model: DBSubcategory,
            as: 'subcategory',
            include: [
                {
                    model: DBProduct,
                    as: 'product',
                }
            ],
        }
    ],
    order: [
        [
            {model: DBSubcategory, as: 'subcategory'},
            {model: DBProduct, as: 'product'},
            'createdDate',
            'DESC'
        ]
    ]
})

【讨论】:

  • 这也适用于外键吗?我在 Object.QueryGenerator.quote (/Users/kristoffer/web/fitch/node_modules/sequelize/lib/dialects/abstract/query-generator. js:869:76)
  • 是的,它有效,在示例“stackoverflow.com/questions/38145702/…”中,使用我的模型声明,只需使用以下代码:User.findAll({ raw: 'true', include: [ { model: UserAttribute, as: "UserAttribute" } ], order: [ [ { model: UserAttribute, as: 'UserAttribute' }, 'userId', 'DESC' ] ] }) .then((users) => { console.log( 'users', users) process.exit() })
【解决方案3】:
order: [
[ db.Sequelize.col('order'), 'DESC'],    /*If you want to order by page module as well you can add this line*/
[ db.Gallery, db.ArtWork, 'order', 'DESC' ]
]

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
  • 它只命令预加载,而不是查询模块。
【解决方案4】:

这对我有用:

let getdata = await categories_recipes.findAll({   
                    order:[ 
                        [{model: recipes, as: 'recipesdetails'},'id', 'DESC'] // change your column name like (id and created_at)
                    ],
                    include:[{
                        model:recipes, as : "recipesdetails",
                        include:[{
                            model:recipe_images, as: "recipesimages",
                        }],
                        where:{
                            user_id:data.id
                        },
                        required: true,
                    }]
                })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多