2016-04-04 14 views
7

Considerare i seguenti modelli:Query tabella di collegamento senza ottenere entrambe le associazioni in Sequelize

var User = sequelize.define('User', { 
    _id:{ 
    type: Datatypes.INTEGER, 
    allowNull: false, 
    primaryKey: true, 
    autoIncrement: true 
    }, 
    name: Datatypes.STRING, 
    email:{ 
    type: Datatypes.STRING, 
    unique: { 
     msg: 'Email Taken' 
    }, 
    validate: { 
     isEmail: true 
    } 
    } 
}); 

var Location= sequelize.define('Location', { 
    _id:{ 
    type: Datatypes.INTEGER, 
    allowNull: false, 
    primaryKey: true, 
    autoIncrement: true 
    }, 
    name: Datatypes.STRING, 
    address: type: Datatypes.STRING 
}); 

Location.belongsToMany(User, {through: 'UserLocation'}); 
User.belongsToMany(Location, {through: 'UserLocation'}); 

C'è un modo per interrogare la tabella di UserLocation per una specifica UserId e ottenere il corrispondente Locations. Qualcosa di simile:

SELECT * FROM Locations AS l INNER JOIN UserLocation AS ul ON ul.LocationId = l._id WHERE ul.UserId = 8

Da quello che riesco a trovare che si può fare qualcosa di simile a:

Location.findAll({ 
    include: [{ 
    model: User, 
    where: { 
     _id: req.user._id 
    } 
    }] 
}).then(loc => { 
    console.log(loc); 
}); 

Tuttavia, questo restituisce il Locations, UserLocation giunzioni, e User cui si unisce la tavola User quando non ho bisogno di alcuna informazione utente e ho solo bisogno dello Locations per quell'utente. Quello che ho fatto funziona, tuttavia, la query rispetto alla tabella di giunzione è preferibile al posto della ricerca sulla tabella User.

Spero che questo sia chiaro. Grazie in anticipo.

Modifica

realtà ho finito per l'attuazione del presente in un modo diverso. Tuttavia, lo farò ancora come una domanda, perché dovrebbe essere possibile.

risposta

3

dichiarando tabella di collegamento come classe separata, qualcosa di simile

var UserLocation = sequelize.define('UserLocation', { 
    //you can define additional junction props here 
}); 

User.belongsToMany(Location, {through: 'UserLocation', foreignKey: 'user_id'}); 
Location.belongsToMany(User, {through: 'UserLocation', foreignKey: 'location_id'}); 

allora si può interrogare tabella di collegamento uguale a qualsiasi altro modello.

+0

Potreste fornire il modo in cui usereste la tabella 'UserLocation' per produrre esattamente la query che l'OP sta chiedendo? Grazie. – alecxe

+0

Non ho potuto provarlo ora perché non ho live sequelize project qui. Ma sono abbastanza sicuro che è possibile utilizzare la tabella di giunzione come qualsiasi altra tabella senza danneggiare la definizione delle relazioni. Nel peggiore dei casi è possibile dichiarare esplicitamente colonne di chiavi esterne su UserLocation, ma suppongo che siano definite su classi sequenziate. (Simile alla colonna id, dichiarata automaticamente, ma se la si ripete esplicitamente nothihng accade) E dopo ciò si dovrebbe usare UserLocation come chiave esterna di base e costruire la query nello stesso modo. – farincz

+0

Ciò non consente ancora di unirsi a una delle entità di associazione con la tabella di giunzione senza l'altra entità di associazione. – jony89

Problemi correlati