2016-04-04 6 views
7

folgende Modelle vor:Abfrage Verknüpfungstabelle beiden Verbände in Sequelize ohne sie

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

Gibt es eine Möglichkeit, die UserLocation Tabelle für ein bestimmtes UserId abfragen und die entsprechenden Locations zu erhalten. Etwas wie:

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

Von dem, was ich finden kann man etwas Ähnliches tun:

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

Doch diese gibt die Locations, UserLocation Kreuzungen und User die es schließt sich der User Tisch wenn ich keine Benutzerinformationen benötige und ich nur die Locations für diesen Benutzer benötige. Was ich getan habe, ist zu arbeiten, jedoch wird die Abfrage gegen die Junction-Tabelle anstelle der Suche in der User Tabelle bevorzugt.

Ich hoffe, das ist klar. Danke im Voraus.

bearbeiten

Ich landete tatsächlich auf diese in einer anderen Art und Weise umzusetzen. Ich werde dies jedoch weiterhin als Frage stellen, weil dies möglich sein sollte.

Antwort

3

erklärt Verknüpfungstabelle als separate Klasse, so etwas wie dieses

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

dann können Sie Verknüpfungstabelle gleiche wie jedes andere Modell abfragen.

+0

Können Sie angeben, wie Sie die Tabelle 'UserLocation' verwenden würden, um genau die Abfrage zu erstellen, nach der das OP fragt? Vielen Dank. – alecxe

+0

Ich konnte es jetzt nicht versuchen, weil ich das Projekt hier nicht leben sequelize. Aber ich bin mir ziemlich sicher, dass Sie die Junction-Tabelle wie jede andere Tabelle verwenden können, ohne die Definition der Beziehungen zu beeinträchtigen. Im schlimmsten Fall können Sie explizit Fremdschlüsselspalten in UserLocation angeben, aber ich nehme an, dass sie in der Klasse durch Sequelized definiert sind. (Ähnlich wie ID-Spalte, automatisch deklariert, aber wenn Sie es redeclare explizit nothihng passiert) Und danach sollten Sie in der Lage sein, UserLocation als grundlegende Fremdschlüssel und konstruieren Abfrage auf die gleiche Weise. – farincz

+0

Dies erlaubt Ihnen immer noch nicht, einer der Assoziationsentitäten mit der Junction-Tabelle ohne die andere Assoziationsentität beizutreten. – jony89