【问题标题】:Sequelize findAll where many to many criteriaSequelize findAll where many to many criteria
【发布时间】:2016-11-05 09:05:48
【问题描述】:

我有 2 个模型 User 和 Item 具有多对多关系,这里是定义:

User = sequelize.define('User', {
    name: {type: Sequelize.STRING}
  })
Item = sequelize.define('Item', {
        name: {
          type: Sequelize.STRING,
          allowNull: false
        }
      }
User.belongsToMany(models.Item, {
     as: 'items',
     through: 'UserItem'
})
Item.belongsToMany(models.User, {
     as: 'owners',
     through: 'UserItem'
})    

我的要求是:

Item.findAll({
    include: [{
      model: User,
      through: {
        where: {id: 2}
      }
    }]
  }).then(items => {
    log.debug(items)
  }).catch(err => {
    log.error(err)
  })

然后我有:Error: User is not associated to Item! 我也试试这个:

Item.findAll({
    where: {'owners.id': 2},
    include: Item.assocations.owners
  }).then(items => {
    debug(items)
  }).catch(err => {
    log.error(err)
  })

但现在我有Error: SQLITE_ERROR: no such column: Item.owners.id 有任何想法吗 ?

【问题讨论】:

    标签: sql node.js orm associations sequelize.js


    【解决方案1】:

    这是我的工作解决方案:

    'use strict'
    const Sequelize = require('Sequelize')
    
    const sequelize = new Sequelize({
      host: 'localhost',
      dialect: 'sqlite',
      // SQLite only
      storage: 'database.sqlite'
    })
    
    const User = sequelize.define('user', {
      name: {
        type: Sequelize.STRING
      }
    }, {
      freezeTableName: true // Model tableName will be the same as the model name
    })
    
    const Item = sequelize.define('item', {
      name: {
        type: Sequelize.STRING
      }
    }, {
      freezeTableName: true // Model tableName will be the same as the model name
    })
    
    const UserItem = sequelize.define('useritem', {})
    
    User.belongsToMany(Item, {
      as: 'items',
      through: 'useritem'
    })
    Item.belongsToMany(User, {
      as: 'owners',
      through: 'useritem'
    })
    
    Promise.all([
      User.sync({force: true}),
      Item.sync({force: true}),
      UserItem.sync({force: true})])
      .then(() => {
      return Promise.all([
        User.create({name: 'test'}),
        User.create({name: 'admin'}),
        Item.create({name: 'item1'}),
        Item.create({name: 'item2'})])
        .then(results => {
          return results[2].addOwner(results[0])
        }).then(() => {
          return Item.findAll({
            include: {model: User, as: 'owners', where:{
              'id': 1
            }}
          }).then(items => {
            console.log(items)
          })
    })
    }).catch(err => console.log(err))
    

    as 需要在include 子句上,where 也应该在include 上添加

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 1970-01-01
      相关资源
      最近更新 更多