#mysql #sequelize.js
#mysql #sequelize.js
Вопрос:
Я использую Sequelize, nodejs ORM для mysql. Используя mysql workbench, я создал диаграмму EEM и перенес этот дизайн в БД, пока все хорошо.
Теперь в Sequelize я должен рассказать, как выглядит дизайн БД, частично это говорит о том, как называются внешние ключи.
В Workbench есть foreign key
вкладка в таблице there are variables formatted like
fd_positions_tradingPLan1`, но я никогда не называю это, на самом деле на моей диаграмме EEM у меня есть
Затем, если я перейду на эту foreign keys
вкладку внизу, я получу это. Я в замешательстве относительно того, что именно я должен сообщить ORM о внешнем ключе…
Комментарии:
1. если вы не назовете FK при их создании, движок автоматически сгенерирует для вас имя — это имя, которое вы видите
2. Значит, это те столбцы в БД? Когда я открываю таблицу, я их не вижу. Я перетащил отношения с диаграммой EEM, так что, возможно, они были введены. Тем не менее, я удалил некоторые FK, потому что в некоторых случаях они добавляли по 4 FK на таблицу, когда мне действительно нужен был только один.
3.
fd_positions_tradingPLan1
иfk_positions_users1
ваши ключи fk. Они не являются столбцами. Имена на вашей первой фотографии — это столбцы4. О, значит, FK не отображаются в столбцах?
Ответ №1:
Давайте возьмем вашу positions
таблицу в качестве ссылки. Чтобы построить свою модель на sequelize, вам нужно выполнить следующее:
module.exports = (sequelize, DataTypes) => {
const Position = sequelize.define('Position', { // this is the name that you'll use on sequelize methods, not what you have on your db
// define your columns like this:
tradeName: { //the name of the variable that you'll use on sequelize and js
field: 'trade_name', //the actual name of your column on the table
type: DataTypes.STRING(128) // the data type
},
// .......
// for your foreignKeys you have to define the column like your other attributes.
userId: {
field: 'user_id',
type: DataTypes.INTEGER
},
}, {
tableName: 'positions', //this is the name of your table on the database
underscored: true, // to recognize the underscore names
createdAt: 'created_at', //
updatedAt: 'updated_at',
});
//now for your association let's say that you defined your USER table like this example.
Position.associate = (models) => {
// on the foreignKey value, youhave to put the same that you define above, and on the db.
Position.belongsTo(models.User, { as: 'User', foreignKey: 'user_id' });
//depending on your other relations, you are gonna use hasMany, hasOne, belongsToMany
};
return Position;
};
Sequelize выполняет ассоциацию только одним способом, это означает, что в этом примере вы не можете запрашивать с помощью sequelize from User
to Position
, чтобы
иметь двустороннюю ассоциацию, которую вы должны определить для обеих моделей.
User.associate = (models) => {
// on this case we use hasMany cause user can have many positions I suppose, if not, use hasOne
User.hasMany(models.Poisition, { as: 'positions', foreignKey: 'user_id' }); //remeber to use the same foreignKey name
};
Обновить:
as
является идентификатором для продолжения. Допустим, вы создаете две ассоциации для одной и той же модели, позже, когда вы попытаетесь запросить одну из этих ассоциаций, вы можете указать нужную ассоциацию
User.associate = (models) => {
User.hasMany(models.Poisition, { as: 'positions', foreignKey: 'user_id' });
User.hasMany(models.Poisition, { as: 'customerPositions', foreignKey: 'customer_id' });
};
//the actual association call
User.findAll({
include:[{
model: db.user,
as: 'positions'
}, {
model: db.user,
as: 'customerPositions'
}]
})
Теперь для fk_positions_users1
, это идентификатор для самого MySQL. Sequelize проверяет только внешний ключ и модели, связанные с ним. Очевидно, что когда Sequelize создает ссылку, она дает имя шаблона, используя имя таблицы и столбца. Я попробовал сам создать новый внешний ключ в своей таблице, а затем обновить модель, и все идет нормально. У вас не должно возникнуть проблем с этим.
Комментарии:
1. Хорошо, я видел подобные примеры, что
{as: 'positions'...
делать? Тогда...foreignKey: 'user_id'
как это получить мои fkfk_positions_users1
из моего сообщения вPositions