2016-07-03 13 views
1

Ich habe 2 Modelle User und Artikel mit vielen zu vielen Beziehung, hier ist die Definitionen:Sequelize findAll wo viele zu viele Kriterien

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

Und mein Wunsch ist:

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

Dann habe ich : Error: User is not associated to Item! ich dies auch versuchen:

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

Aber ich habe jetzt Error: SQLITE_ERROR: no such column: Item.owners.id Irgendwelche Ideen?

Antwort

0

Hier ist meine Arbeitslösung:

'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 Notwendigkeit, auf include Klausel sein und where sollte auf include zu

hinzugefügt werden