// Criar Migration
yarn sequelize migration:create --name=NOMEdaMIGRATION
// Edita a migration colocando os campos necessarios e os relacionamentos
// Executar Migrate
yarn sequelize db:migrate
// Cria o arquivo de model
// Importa o model no arquivo index do database
// Cria o Controller
// Importa nas rotas
// Migration de acrescentar coluna em alguma databela ja criada
module.exports = {
up: (queryInterface, Sequelize) => {
// Primeiro a tablea que vc quer adcionar a nova coluna no caso abaixo 'users'
// Segundo qual o nome da coluna 'avatar_id'
// O tipo no caso abaixo eh so o id por isso integer
// Depois cria um relacionamento no caso com a tabela Files que contem as imagens dos avatares
// Ai informa que todo id relacionado na tabela files vai ser igual ao avatar_id da tabela users
// No caso de delecao de arquivos da tabela files ele seta null na tabela users no onDelete
// No caso de update da tabela Files ele atualiza na tabela users com o onUpdate
return queryInterface.addColumn('users', 'avatar_id', {
type: Sequelize.INTEGER,
references: { model: 'files', key: 'id' },
onUpdate: 'CASCADE',
onDelete: 'SET NULL',
allowNull: true,
});
},
// No caso de reversao da migration ele remove a coluna 'avatar_id' na tabela users
down: queryInterface => {
return queryInterface.removeColumn('users', 'avatar_id');
},
};
// Fim
// No arquivo de model de usuario ele vai receber um id da tabela de files
// Referencia que o avatar_id pertence a tabela de files
// no arquivo de User.model
static associate(models) {
this.belongsTo(models.File, { foreignKey: 'avatar_id' });
}
// No arquivo index, de dentro da pasta de database onde se importa os models e as configs do database
// vai verificar se o metodo associate existe e se existir vai chamalo
.map(model => model.associate && model.associate(this.connection.models));
//ex Model:
import Sequelize, { Model } from 'sequelize';
import bcrypt from 'bcryptjs';
class User extends Model {
static init(sequelize) {
super.init(
{
name: Sequelize.STRING,
email: Sequelize.STRING,
password: Sequelize.VIRTUAL,
password_hash: Sequelize.STRING,
provider: Sequelize.BOOLEAN,
},
{
sequelize,
}
);
this.addHook('beforeSave', async user => {
if (user.password) {
user.password_hash = await bcrypt.hash(user.password, 8);
}
});
return this;
}
// Referencia que o avatar_id pertence a tabela de files
static associate(models) {
this.belongsTo(models.File, { foreignKey: 'avatar_id' });
}
checkPassword(password) {
return bcrypt.compare(password, this.password_hash);
}
}
export default User;
//Ex index de database
import { Sequelize } from 'sequelize';
import User from '../app/models/User';
import File from '../app/models/File';
import databaseConfig from '../config/database';
const models = [User, File];
class Database {
constructor() {
this.init();
}
init() {
this.connection = new Sequelize(databaseConfig);
models
.map(model => model.init(this.connection))
.map(model => model.associate && model.associate(this.connection.models));
}
}
export default new Database();