#node.js #database #postgresql #express #sequelize.js
#node.js #База данных #postgresql #экспресс #sequelize.js
Вопрос:
Я создаю конечные точки RestAPI для приложения для социальных сетей, такого как Instagram.
Есть 4 таблицы
- Пользователь
- Публикация
- постЛайки
- postMedia
Ассоциации… У одного пользователя есть много сообщений, одно сообщение принадлежит одному пользователю, сообщение имеет много лайков, сообщение имеет много постмедий, Постлайк принадлежит одному сообщению и принадлежит одному пользователю, постМедиа принадлежит одному сообщению,
Если вы все еще немного неясны, пожалуйста, прокомментируйте, любая помощь будет высоко оценена.
models/user.js
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class User extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here👀👀👀👀👀👀👀
User.hasMany(models.Post, {
foreignKey: 'user_id',
as: 'posts',
onDelete: 'CASCADE',
});
User.hasMany(models.postLikes, {
foreignKey: 'user_id',
as: 'postLikes',
onDelete: 'CASCADE',
});
}
};
User.init({
profile_img: DataTypes.STRING,
firstname: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING,
phone: DataTypes.STRING,
password: DataTypes.STRING,
dob: DataTypes.STRING,
gender: DataTypes.ENUM('male', 'female'),
token: DataTypes.STRING,
is_deleted: DataTypes.BOOLEAN,
}, {
sequelize,
modelName: 'User',
});
return User;
};
models/post.js
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Post extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here👀👀👀👀👀👀
Post.hasMany(models.postLikes, {
foreignKey: 'post_id',
as: 'postLikes',
onDelete: 'CASCADE',
});
Post.hasMany(models.postMendia, {
foreignKey: 'post_id',
as: 'postMedia',
onDelete: 'CASCADE',
})
}
};
Post.init({
description: DataTypes.STRING,
user_id: DataTypes.INTEGER,
is_deleted: DataTypes.BOOLEAN,
}, {
sequelize,
modelName: 'Post',
});
return Post;
};
models/postLikes.js
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class postLikes extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here👀👀👀👀👀
postLikes.belongsTo(models.Post, {
foreignKey: 'post_id',
as: 'post',
});
postLikes.belongsTo(models.User, {
foreignKey: 'user_id',
as: 'user',
})
}
};
postLikes.init({
post_id: DataTypes.INTEGER,
user_id: DataTypes.INTEGER
}, {
sequelize,
modelName: 'postLikes',
});
return postLikes;
};
models/postMedia.js
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class postMedia extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here👀👀👀👀👀👀👀
postMedia.belongsTo(models.Post, {
foreignKey: 'post_id',
as: 'post'
})
}
};
postMedia.init({
url: DataTypes.STRING,
post_id: DataTypes.INTEGER,
type: DataTypes.ENUM('image', 'video')
}, {
sequelize,
modelName: 'postMedia',
});
return postMedia;
};
После создания ассоциаций во всех вышеперечисленных моделях я запускаю команду
sequelize db:migrate
Но когда я открываю консоль pgAdmin4, я не вижу никакого внешнего ключа.
PS Я имею в виду эту статью https://dev.to/nedsoft/getting-started-with-sequelize-and-postgres-emp
Ответ №1:
В приведенном выше блоге парень никогда не говорил нам, что мы должны добавить
references: {
model: {
tableName: 'Users',
schema: 'public'
},
внутри миграций….
Обратитесь к этой странице… Просто CTRL F для ForeignKey на странице, и вы попадете туда. Продолжить ДОКУМЕНТЫ
Потрачено более 4 часов на это