Fórum Fazer um update no sequelize com associação hasToMany. #602021
25/04/2019
0
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
Curtir tópico
+ 0
Responder
Posts
25/04/2019
Ramiro Porto
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));
};
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)