[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