Sequelize - Как создать ассоциацию один на один? - PullRequest
0 голосов
/ 20 октября 2019

Я создаю две модели, первая из которых User, а вторая Portfolio. Когда пользователь создает Portfolio (где у пользователя может быть только один Portfolio), я хочу, чтобы он имел ссылку на пользователя, который его создает, и каждый раз, когда пользовательские данные выбираются, я хочу, чтобы он такжеизвлечение данных их портфеля, если таковые имеются.

Я пытаюсь использовать hasOne для создания portfolio_id внутри User таблиц, при этом скелет генерируется с помощью команды sequelize init, но он не работает. Я не могу найти столбец с именем protfolio_id, если не помещаю его в файл миграции пользователя. Это так и должно быть?

Как мне проектировать модели? Должен ли я включить portfolio_id в User таблицы и включить user_id в Portfolio таблицу, или есть лучший способ сделать это?

И какой метод ассоциаций я должен использовать, hasOne или ownTo

1 Ответ

1 голос
/ 20 октября 2019

Прежде всего убедитесь, что вы звоните 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"
        }
    }
*/
...