[SP-pm] Class::DBI relationships

André Garcia Carneiro andre.garcia.carneir em terra.com.br
Quarta Outubro 11 14:28:49 PDT 2006


Olá Monges!

Venho a vocês mais uma vez humildemente buscar conhecimento.

Estou tentando resolver um problema de relacionamentos com o Class::DBI. Aparentemente, não há erros, mas o
objeto da minha pesquisa retorna sem dados, e eu não faço idéia do porque. O código segue abaixo:



sub check_volunteer_exists
{
	
	my $parameters = shift;	
	package VOLUNTEER::DBI;
	use CGI;
	use base 'Class::DBI';

	package VOLUNTEER::Volunteer;
	use base 'VOLUNTEER::DBI';
	my $sconf = new SiteConfig;	
	my $dsn = "DBI:".$sconf->dbdriver.":database=".$sconf->database.";host=".$sconf->dbhost;

	VOLUNTEER::DBI->connection($dsn,$sconf->dbuser,$sconf->dbpasswd,{RaiseError=>1,AutoCommit=>0});
	VOLUNTEER::Volunteer->table('VOLUNTARIO');
	VOLUNTEER::Volunteer->columns( All => qw/ NOME ID_VOLUNTARIO /);

	package VOLUNTEER::PessoaFisica;
	use base 'VOLUNTEER::Volunteer';
	VOLUNTEER::PessoaFisica->table('PESSOA_FISICA');
	VOLUNTEER::PessoaFisica->columns( All => qw/ NR_IDENTIDADE ID_VOLUNTARIO/);
	VOLUNTEER::PessoaFisica->has_a(ID_VOLUNTARIO => 'VOLUNTEER::Volunteer'); #Teoricamente, isso deveria resolver
o relacionamento.


	my $data = VOLUNTEER::PessoaFisica->search(NOME => $parameters->{name}, NR_IDENTIDADE => $parameters->{rg});
	use Data::Dumper;
	print STDERR Dumper $data;
	while(my $result = $data->next)
	{
		if ($result->NOME && $result->NR_IDENTIDADE)
		{
			return 1;
		}	
	}	
	return 0;
	
}

Volunteer e Pessoa física são objetos que representam as tabelas, respectivamente, VOLUNTARIO e PESSOA_FISICA,
e estão em um banco de dados(mysql, por enquanto, mas vão pro ORACLE9i em breve), que tem um relacionamento de
1 para 1. O campo que liga os dois chama-se ID_VOLUNTARIO, e existe nas duas tabelas(óbvio, só pra não parecer
tão noobie).

Usando o Data::Dumper no objeto $data, obtive o seguinte:

$VAR1 = bless( {
                 '_data' => [],
                 '_place' => 0,
                 '_mapper' => [],
                 '_class' => 'VOLUNTEER::PessoaFisica'
               }, 'Class::DBI::Iterator' );


Ele deveria ter dados em _data, mas vem vazio. Preciso disso para verificar voluntários que possivelmente já
estejam cadastrados no banco de dados.


Para chegar nesse código, consultei o manual do Class::DBI, e não consegui resultado, por isso estou apelando a
vocês. Parecço meio desesperado, não acham??? :) - E estou mesmo :(

Não quero "apelar feio" e voltar usar DBI apenas, para resolver o problema. Gostaria de usar o Class::DBI. 


Se alguém tiver alguma idéia, por favor não deixem de escrever, por favor.

De qualquer forma, fico agradecido.



Cheers!


--
André Garcia Carneiro
Developer(Perl/PHP)
Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org



Mais detalhes sobre a lista de discussão SaoPaulo-pm