[Cascavel-pm] DBIx::Class Inserção em tabelas relacionadas
Márcio Vitor
cromo.jml em gmail.com
Quinta Abril 16 07:03:36 PDT 2009
Nélio,
As tabelas estão criadas no banco com o Cascade?
Não sei como o Dbix Class lida com isto, mas de repente o mysql já inseriu e
o dbix-class tá tentando inserir novamente.
Márcio Vitor
2009/4/16 Nélio Nunes <nelio.nunes em sapo.pt>
> 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
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20090416/862d6bc4/attachment.html>
Mais detalhes sobre a lista de discussão Cascavel-pm