Fazer um update no sequelize com associação hasToMany.
Boa noite. Estou postando aqui porque já cansei de abrir,literalmente, uns 300 links da internet kkk .
Não estou conseguindo fazer um update no sequelize com associacao hasToMany. Não funciona comigo nem a pau..
O create com associacao eu penei mas consegui fazer.já update tá brabo.até usando o método "sequelize.query()" eu não consigo, porque
tenho que executar multiplas querys( update tabela set campo = "x") e recebo erro de sintaxe..enfim tenho duas tabelas "parceiro" e "horario_funcionamento" , que estão mapeadas no model do sequelize ; quando eu atualizar a tabela "parceiro", eu quero no mesmo comando atualizar os horarios na outra tabela..ve se alguem pode me ajudar...grato script das tabelas abaixo
Essa dúvida foi gerada a partir de um comentário na aula [url:descricao=Criando um Model com o Sequelize - Minha Primeira API RESTful com Node.js - Vídeo 5]https://www.devmedia.com.br/criando-um-model-com-o-sequelize-minha-primeira-api-restful-com-node-js-video-5/40202[/url]
Não estou conseguindo fazer um update no sequelize com associacao hasToMany. Não funciona comigo nem a pau..
O create com associacao eu penei mas consegui fazer.já update tá brabo.até usando o método "sequelize.query()" eu não consigo, porque
tenho que executar multiplas querys( update tabela set campo = "x") e recebo erro de sintaxe..enfim tenho duas tabelas "parceiro" e "horario_funcionamento" , que estão mapeadas no model do sequelize ; quando eu atualizar a tabela "parceiro", eu quero no mesmo comando atualizar os horarios na outra tabela..ve se alguem pode me ajudar...grato script das tabelas abaixo
CREATE TABLE parceiro ( id INT AUTO_INCREMENT PRIMARY KEY , nome VARCHAR(100) NOT NULL , cnpj VARCHAR(15) , ie VARCHAR(15) , email VARCHAR(50) , senha VARCHAR(50) , telefone1 VARCHAR(20) , telefone2 VARCHAR(20) , situacao CHAR(1) DEFAULT 'a' , logradouro VARCHAR(50) , complemento VARCHAR(50) , nro VARCHAR(5) , bairro VARCHAR(50) , cidade VARCHAR(50) , cep VARCHAR(8) , dt_inclusao TIMESTAMP DEFAULT CURRENT_TIMESTAMP , dt_alteracao DATETIME ); create table horario_funcionamento( id INT AUTO_INCREMENT PRIMARY KEY , parceiro_id INT NOT NULL , hora_ini VARCHAR(5) NOT NULL , hora_fim VARCHAR(5) NOT NULL , dia INT NOT NULL , situacao CHAR(1) DEFAULT 'a' , dt_inclusao TIMESTAMP DEFAULT CURRENT_TIMESTAMP , dt_alteracao DATETIME); --- UPDATE NO SEQUELIZE ( NAO FUNCIONA) Parceiro.hasMany(HorarioFuncionamento, { foreignKey: "parceiro_id" }); Parceiro.findByPk(id, { include: HorarioFuncionamento }) .then(parceiro => { if (parceiro) { parceiro.update( { nome: nome, telefone1: telefone1, telefone2: telefone2, nro: nro, cep: cep, cidade: cidade, bairro: bairro, complemento: complemento, logradouro: logradouro, email: email, cnpj: cnpj, ie: ie, horario_funcionamentos: horarios /* ARRAY de horarios*/ } ), { include: HorarioFuncionamento } .then(() => { response.status(status.OK).send(); }) .catch(error => next(error)); } else { response.status(status.NOT_FOUND).send(); } }) .catch(error => next(error));
Essa dúvida foi gerada a partir de um comentário na aula [url:descricao=Criando um Model com o Sequelize - Minha Primeira API RESTful com Node.js - Vídeo 5]https://www.devmedia.com.br/criando-um-model-com-o-sequelize-minha-primeira-api-restful-com-node-js-video-5/40202[/url]
Ramiro Porto
Curtidas 0
Respostas
Ramiro Porto
25/04/2019
galera, boa noite. Não sei se é o jeito certo ou se é uma gambiarra,mas consegui resolver o meu problema de outra forma, utilizando o "Promise.all".
Aparentemente, está funcionamento corretamente e com controle de transação. Segue abaixo o código, para que possa também ajudar alguém futuramente.
Parceiro.findByPk(id)
.then(parceiro => {
if (parceiro) {
const dtAlteracao = Date.now();
sequelize.transaction(function (t) {
var promises = []
var promiseUpdate = Parceiro.update({
nome: nome, telefone1: telefone1, telefone2: telefone2,
nro: nro, cep: cep, cidade: cidade, bairro: bairro,
complemento: complemento, logradouro: logradouro, email: email, cnpj: cnpj,
ie: ie, dt_alteracao: dtAlteracao
}, { where: { id: parceiro.id }, transaction: t });
console.log(parceiro.id);
promises.push(promiseUpdate);
for (var i = 0; i < horarios.length; i++) {
var hPromise = HorarioFuncionamento.update({
hora_ini: horarios[i].hora_ini,
hora_fim: horarios[i].hora_fim,
dia: horarios[i].dia,
situacao: horarios[i].situacao,
dt_alteracao: dtAlteracao
}, { where: { id: horarios[i].id }, transaction: t });
promises.push(hPromise);
};
return Promise.all(promises);
}).then(function () {
console.log("SUCCESS!!! ( commit)");
response.status(status.OK).send();
}).catch(function (err) {
console.log("FAILURE !!! ( rollback)");
return next(err);
});
}
}).catch(error => next(error));
};
Aparentemente, está funcionamento corretamente e com controle de transação. Segue abaixo o código, para que possa também ajudar alguém futuramente.
Parceiro.findByPk(id)
.then(parceiro => {
if (parceiro) {
const dtAlteracao = Date.now();
sequelize.transaction(function (t) {
var promises = []
var promiseUpdate = Parceiro.update({
nome: nome, telefone1: telefone1, telefone2: telefone2,
nro: nro, cep: cep, cidade: cidade, bairro: bairro,
complemento: complemento, logradouro: logradouro, email: email, cnpj: cnpj,
ie: ie, dt_alteracao: dtAlteracao
}, { where: { id: parceiro.id }, transaction: t });
console.log(parceiro.id);
promises.push(promiseUpdate);
for (var i = 0; i < horarios.length; i++) {
var hPromise = HorarioFuncionamento.update({
hora_ini: horarios[i].hora_ini,
hora_fim: horarios[i].hora_fim,
dia: horarios[i].dia,
situacao: horarios[i].situacao,
dt_alteracao: dtAlteracao
}, { where: { id: horarios[i].id }, transaction: t });
promises.push(hPromise);
};
return Promise.all(promises);
}).then(function () {
console.log("SUCCESS!!! ( commit)");
response.status(status.OK).send();
}).catch(function (err) {
console.log("FAILURE !!! ( rollback)");
return next(err);
});
}
}).catch(error => next(error));
};
GOSTEI 0