Что означает иностранный ключ в Sequelize.hasMany / ownTo? - PullRequest
0 голосов
/ 04 марта 2020

Я недавно использовал Sequelize ORM.

У меня есть две таблицы. Одна - Users, а другая - Posts

Схема этих двух таблиц выглядит следующим образом

Users {
  id: Integer,
  name: String,
  age: Integer
}

Posts {
  id: Integer,  // refers to the id of post itself
  author_id: Integer, // refers to the id of the author of this post
  title: String,
  content: String
}

Я хочу создать одну (Пользователи) -в-многих ( Сообщения) ассоциация между ними. Чтобы сделать это, мне нужно указать в моделях hasMany & Бонус .

Однако меня очень смущает значение параметров foreignKey / sourceKey / targetKey.

Скажите, что я уже определил и создал свою таблицу с миграциями. Имя атрибута, который является ForeignKey, в данном случае author_id .

Я думаю, в belongsTo, foreignKey означает «имя атрибута, который собирается be foreignKey в исходной таблице "?

Но в hasMany, foreignKey означает" имя атрибута, на который ссылается предстоящий foreignKey "

Итак, foreignKey в belongsTo будет author_id (в таблице сообщений), но foreignKey в hasMany будет id (в таблице Users)?

Кроме того, что на земля значит sourceKey / targetKey!?

1 Ответ

0 голосов
/ 04 марта 2020

Хорошо ... у вас есть интересный случай выше ... если вы использовали user_id вместо author_id, то вы можете обойтись без объявления их, так как sequelize может принять их правильно ... Однако, поскольку вы назвали его author_id, тогда ваш hasMany определенно нужно знать, что внешний ключ называется author_id в вашей таблице сообщений ... Допустим, вы назвали свой идентификатор в пользовательской таблице чем-то вроде «user» вместо «id» .... хорошо, sequelize не поймет этого и быть в состоянии вывести, к чему он присоединяется, поэтому вы можете сказать, что sourceKey = "user" и foreignKey = "author_id" ... Чтобы еще больше, вы можете столкнуться с проблемами в дизайне базы данных, где вам нужно указать, что targetKey или otherKey - это потому, что кто-то называл вещи странными ... так как вы сказали выше в вашем ownTo, author_id не будет иметь никакого представления о том, что он должен отображаться обратно в "user" для его соединения, поэтому вы должны указать foreignKey = "author_id" and otherKey = "user" ... Это заняло у меня некоторое время, чтобы обернуть голову а также потому, что мне не удалось спроектировать базу данных, я реализовал graphql / sequelize против ... Поэтому мне пришлось широко использовать sourceKey, targetKey и otherKey et c et c в моих объединениях ..

Попытайтесь думать об этом действительно логически, и это будет иметь больше смысла ... если ваш первичный ключ всегда "id", а ваш foreignKey всегда "tablename_id", то вам не нужно будет слишком беспокоиться о других свойствах ... но когда именование не совпадает, нужно сказать sequelize, какие ключи использовать, и именно поэтому эти другие свойства существуют ... Sequelize чертовски умный, но он не может восполнить плохой дизайн БД или плохое соединение Имена столбцов ... Надеюсь, это поможет, если нет, у меня есть много примеров, которые я могу опубликовать для вас. Приветствия

...