mysql 从序列化查询中排除主键属性

svujldwt  于 2023-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(123)

我有一个sequelize查询从多个表内部连接在一起。我需要在嵌套的include模型上将它们分组,但sequelize查询每次都会抛出主键,即使我将属性指定为:attributes:[]
但是attributes:[]适用于嵌套的include模型。

kmpatx3s

kmpatx3s1#

您可以通过将exclude数组传递到attributes选项中来排除任何属性:

MyModel.findAll({
  attributes: {exclude: ['some_field']}
});
kyks70gy

kyks70gy2#

对于包含的型号,请使用attributes: ['prop_name']
记住include/exclude不会影响使用through: { attributes:[]}的嵌套表

Model.addScope('scope_name', {
      attributes: ['id', 'name'],
      include: [
        {
          model: models.role,
          as: 'roles',
          attributes: ['name'],
          through: {
            attributes: []
          }
        }
      ]

更多细节可以在这里找到:https://github.com/sequelize/sequelize/issues/4074#issuecomment-153054311

ny6fqffe

ny6fqffe3#

我想补充的是,你可以显式地列出你想要的属性,它们在嵌套的内部连接上工作,如下所示:

const my_model = await MyModel.findById(id, {
  include: [
    {
      model: AnotherModel,
      attributes: [ 'displayName', 'email' ] // only these attributes returned
    },
    { model: YetAnotherModel,
      include: [{
        model: AnotherModel,
        attributes: [ 'id', 'displayName', 'email' ]
      }]
    }
  ]
})

返回的Object应该如下所示:

{
  // ...MyModel attributes
  ,
  AnotherModel: {
    displayName: '...',
    email: '...',
  },
  YetAnotherModel: {
    // ...YetAnotherModel's attributes
    ,
    AnotherModel: {
      id: '...',
      displayName: '...',
      email: '...',
    }
  }
}
tnkciper

tnkciper4#

对于那些仍然在寻找解决这个问题的方法。从https://github.com/sequelize/sequelize/pull/4029开始,如果将raw: true添加到查询中,它将删除主键。

Model.findOne({ 
  attributes: [
    [Sequelize.fn('SUM', Sequelize.col('field')), 'sum'],
  ],
  raw: true
})

相关问题