[Cascavel-pm] DBIx::Class Inserção em tabelas relacionadas
Nélio Nunes
nelio.nunes em sapo.pt
Quinta Abril 16 06:51:52 PDT 2009
Caros,
Ando aqui com um problema bicudo em que os ninjas do DBIx::Class
poderão me ajudar, espero:
Tenho 2 tabelas, uma principal, outra secundaria, com uma relação one
to many de uma para a outra.
a tabela principal é qq coisa deste género: (output do show create)
CREATE TABLE `Servicos` (
`id` int(11) NOT NULL,
`semaforo` varchar(255) NOT NULL,
(...)
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
a tabela secundária é isto:
CREATE TABLE `Links_relacionados` (
`id` int(11) NOT NULL,
`nome` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL,
`id_servico` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_servico` (`id_servico`),
CONSTRAINT `servicos_fk` FOREIGN KEY (`id_servico`) REFERENCES
`Servicos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
nas classes DBIx relativas ás duas tabelas, tenho o seguinte:
package SAPO::Servicos;
(...)
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
"links_relacionado",
"SAPO::LinksRelacionados",
{ "foreign.id_servico" => "self.id" },
);
package SAPO::LinksRelacionados;
(...)
__PACKAGE__->set_primary_key("id");
__PACKAGE__->belongs_to("id_servico", "SAPO::Servicos", { id =>
"id_servico" });
Agora, quando é que isto estoura:
Quando se tenta fazer um create_or_update com a seguinte estrutura:
my $servicox = {
id => "6969",
semaforo => "zemaria",
logotipo_servico => "logotipo.gif",
link_servico => "http://um_link_qq",
url_feed_rss => "http://um_rss_qq",
title => "da-lhe duro",
semaforo_destacado => 1,
destacar_no_servico => 1,
links_relacionado => [
{ id => '293874', nome => "ola maria", url => "http://
um_url_qq" },
{ id => '293875', nome => "ola maria", url => "http://
um_url_qq" }
],
};
$schema->resultset('Servicos')->update_or_create($servicox, {id =>
"6969"});
Na primeira inserção, tudo corre bem, quando se tenta alterar alguma
coisa e executar novamente, dá um erro de DBI:
DBIx::Class::ResultSet::update_or_create(): DBI Exception:
DBD::mysql::st execute failed: Duplicate entry '293874' for key 1 [for
Statement "INSERT INTO Links_relacionados ( id, id_servico, nome, url)
VALUES ( ?, ?, ?, ? )" with ParamValues: 0='293874', 1='6969', 2='ola
maria', 3='http://um_url_qq']
O comportamento do update_or_create não se deveria estar a propagar
pelas tabelas relacionadas?
Alguém tem ideia do que é que pode estar a acontecer aqui?
[]'s
Nélio
Mais detalhes sobre a lista de discussão Cascavel-pm