在Node Sequelize中对急切加载的嵌套模型的排序结果

omqzjyyz  于 2023-04-29  发布在  Node.js
关注(0)|答案(6)|浏览(111)

我有一套复杂的相关模型。这些模型使用连接表进行关联,每个连接表都有一个名为“order”的属性。我需要能够查询父模型'页面',包括相关的模型,并按字段'顺序'排序这些关联。
以下内容对结果的排序顺序没有影响:

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

r6l8ljro1#

我相信你可以做到:

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' ]
  ]
})

也有一堆不同的方式,或你可以做的事情时订购。阅读更多: www.example.com

osh3o9ms

osh3o9ms2#

如果你也使用'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'
        ]
    ]
})
xuo3flqw

xuo3flqw3#

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' ]
]
pgpifvop

pgpifvop4#

这对我很有效:

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,
                    }]
                })
inn6fuwd

inn6fuwd5#

为了完整起见,另一个同样有效的方法是使用sequelize.col,如下所示:

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

在这个特定的例子中,它比https://stackoverflow.com/a/30017078/895245的数组(它更显式地使用现有的Js类而不是魔术字符串)稍差,但似乎在大多数情况下,除了order:.col是可以接受的,但数组不是,所以记住它也是很好的。
当你还需要在嵌套包含中使用limit:时,还有一些额外的困难需要克服:

当仅限制顶层时,似乎需要subQuery: false。例如:

u0WithComments = await User.findOne({
    where: { id: u0.id },
    order: [[
      'Comments', 'body', 'DESC'
    ]],
    limit: 1,
    subQuery: false,
    include: [{
      model: Comment,
    }],
  })
ldioqlga

ldioqlga6#

我不需要填充根模型的order属性(在本例中是db。Page)。
相反,我向嵌套模型添加了顺序。在该示例中,db.艺术品
但是,Sequelize的order属性不能是字符串数组,其中每个字符串都是列名,最后一个字符串是方向。例如:

// Failed:
order: ['column1', 'column2', 'column3', 'DESC'],

相反,它必须由一个数组组成,其中每个元素都是由两个元素组成的另一个数组:

  • 我们希望订购的色谱柱,以及
  • 方向

例如:

// Worked:
order: [['column1', 'ASC'], ['column2', 'DESC'], ['colum3', 'DESC']],

因此,对我有效的方法是对db的内容进行排序。列order在后代方向上的插图为:

include: [{
  model: db.Artwork,
  order: [['order', 'DESC']]
}]

我从another answer得到了这个答案,我在SO上找到了这个答案。

相关问题