При создании нового элемента мой foreignKey всегда равен нулю. Sequelize, Node, Postgresql - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть модель пользователя и модель команды, которую я хочу связать.

Пользователь. js Модель

"use strict";
module.exports = sequelize => {
  const User = sequelize.define(
    "User",
    {
      id: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV1,
        primaryKey: true,
        allowNull: false
      },
        ...more fields
    }
    { tableName: "Users", timestamps: true }
  );

User.associate = function(models) {
    // 1 to many with skill
    User.hasMany(models.Skill, {
      foreignKey: "userId"
    });
    // 1 to many with team
    User.hasMany(models.Team, {
      foreignKey: "userId"
    });
  };

  return User;
};

Команда. js Модель

"use strict";
module.exports = (sequelize, DataTypes) => {
  const Team = sequelize.define(
    "Team",
    {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
      },
      ...more fields
    },
    { tableName: "Teams", timestamps: true }
  );

  Team.associate = function(models) {

    Team.belongsTo(models.User, {
      foreignKey: "userId"
    });
  };
  return Team;
};

Столбец userId автоматически добавляется в таблицу команды с правильным типом (uuid), но независимо от того, что я пытаюсь, он всегда равен нулю.

Я пытался просто определить без параметров и снова столбец была добавлена, но при создании команды была установлена ​​на ноль.

1). Определите ассоциации без вариантов.

User.associate = function(models) {
    User.hasMany(models.Team);
}

Кроме того, у меня есть еще одна таблица «Умения», в которой используется тот же код, но он работает.

"use strict";
module.exports = (sequelize, DataTypes) => {
  const Skill = sequelize.define(
    "Skill",
    {
      id: {
        type: DataTypes.INTEGER,
        allowNull: false,
        autoIncrement: true,
        primaryKey: true
      },
    },
    { tableName: "Skills", timestamps: true }
  );

  Skill.associate = models => {
    Skill.belongsTo(models.User, {
      foreignKey: "userId"
    });
  };

  return Skill;
};

Это метод, который я использую для создания команды.

// Create a new team
exports.createTeam = async (req, res) => {
  // Get the user id from the session
  const userId = req.session.passport.user.id;

  const { title } = req.body;

  // Make sure the user hasn't already created a team with that title.
  const existingTeam = await models.Team.findOne({
    where: { title: title, userId: userId }
  });

  if (existingTeam !== null) {
    // Response and let the user know.
    ...
    return;
  }

  const defaultTeamValues = {
    title: title,
    ...
  };

  // No existing team was found with that title and created by that user.

  // Create it.
  const team = await models.Team.create(defaultTeamValues);

  // Done
  res.status(200).json(team);
};

Новая запись в таблице Team, показывающая нулевое значение в столбце внешнего ключа (userId). new record with null value in foreign key (userId).

Я использую pgAdmin 4 для просмотра таблиц, и каждая таблица имеет правильные ограничения fkeys.

Мне кажется, что я упускаю что-то простое здесь, но я прочитал документы и искал похожие проблемы, но не нашел то, что мне нужно. Что мне не хватает?

1 Ответ

0 голосов
/ 15 февраля 2020

Хорошо, я понял проблему. Вместо использования

// Look for existing team
const existingTeam = await models.Team.findOne({
  where: { title: title, userId: userId }
});

if (existingTeam !== null) {
  ...
  return;
}

// No existing team was found with that title and created by that user.

// Create it.
const team = await models.Team.create(defaultTeamValues);

я переключаюсь на этот метод.

const team = await models.Team.findOrCreate({
    where: {
      title: title,
      userId: userId
    },
    // title and userId will be appended to defaults on create.
    defaults: defaultTeamValues
  });

Разница в том, что findOrCreate добавит значения в запросе where к предоставленным вами значениям по умолчанию.

Это то, что я делал ранее, когда добавлял новые навыки, и поэтому в моих записях навыков был указан идентификатор пользователя, а в командах - нет.

Так что на данный момент я не знаю, являются ли мои ассоциации даже работает, потому что я на самом деле просто добавляю значение userId в новую запись.

Вернемся к чтению документации и тестированию.

...