Прежде всего убедитесь, что вы звоните Model.associate
для каждой модели. Это запустит запросы для всех отношений.
Вы можете определить отношения в методе ассоциирования следующим образом:
// user.js (User Model definition)
module.exports = (sequelize, dataTypes) => {
const { STRING } = dataTypes
const User = sequelize.define("user", {
username: { type: STRING }
})
User.associate = models => {
User.hasOne(models.Portfolio, { foreignKey: "userId" }) // If only one portfolio per user
User.hasMany(models.Portfolio) // if many portfolios per user
}
return User
}
// portfolio.js (Portfolio Model definition)
module.exports = (sequelize, dataTypes) => {
const { STRING } = dataTypes
const Portfolio = sequelize.define("portfolio", {
portfolioName: { type: STRING }
})
Portfolio.associate = models => {
Portfolio.belongsTo(models.User, { foreignKey: "userId" })
}
return Portfolio
}
hasOne сохраняет ForeignKey вцелевая модель. Таким образом, это отношение добавит внешний ключ userId
к модели Portfolio
.
ownTo сохраняет ключ в текущей модели и ссылается на первичный ключ целевой модели. В этом случае Portfolio.belongsTo
добавит userId
в модель Portfolio
, которая будет ссылаться на первичный ключ модели User
.
Обратите внимание, что оба эти отношения делают одно и то же, они добавляют userId кМодель портфолио. Лучше определить это в обеих моделях для вашего последнего варианта использования:
Я хочу, чтобы он имел ссылку на пользователя, который его создает, и каждый раз, когда пользовательские данные выбираются, я хочу, чтобытакже извлекает данные своего портфеля, если таковые имеются.
Доступ к связанным моделям:
При последовательном извлечении связанная модель вместе с основной моделью называется EagerЗагрузка . Подробнее об этом здесь .
Теперь для вашего случая использования, если вы хотите получить портфель, если таковой имеется, при извлечении пользователя сделайте следующее:
var userWithPortfolio = await User.findAll({include: [models.Portfolio]};
// Or you may also use include: {all: true} to include all related models.
var userWithPortfolio = await User.findAll({include: {all: true}};
/*
Output:
userWithPortfolio = {
username: "xyz",
portfolio: {
portfolioName: "xyz"
}
}
*/