Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /home/hufersil/hufersil.com.br/system/libraries/lumine/lib/Connection/MySQL.php on line 516
HUFERSIL WEBDEVELOPER - Relacionamentos

HUFERSIL.WEBDEVELOPER - SoluƧƵes com qualidade - Hugo Ferreira da Silva

Relacionamentos Seg, 21 de janeiro de 2008 - as 21h35

Lumine trabalha atualmente com 3 tipos de relacionamentos: one-to-many, many-to-one e many-to-many.

Relacionamentos many-to-one e one-to-many

Supondo que você tenha duas tabelas: uma chamada pessoas e outra chamada carros. Uma pessoa, pode contar vários carros. Logo, você pode colocar um campo na tabela de carros indicando o código da pessoa que possui aquele carro. Logo muitos (many) carros para uma (one) pessoa.

Então, o relacionamento seria parecido com o abaixo:

  1. // para Pessoas
  2. // nome do relacionamento, tipo, nome da classe estrangeira, campo de linkagem na outra classe, tabela uniĆ£o, nome da coluna na tabela uniĆ£o, lazy
  3. $this->_addForeignRelation('carros', self::ONE_TO_MANY, 'Carro', 'pessoa', null, null, null);
  4.  
  5. // para Carros
  6. // Veja "Mapeamento de classes" para mais detalhes deste valores
  7. $this->_addField('pessoa', 'idpessoa', 'int', 11, array('foreign' => '1', 'onUpdate' => 'CASCADE', 'onDelete' => 'CASCADE', 'linkOn' => 'idpessoa', 'class' => 'Pessoa'));

Note que para Lumine reconheça automaticamente o relacionamento, é necessário que esteja definido em ambas as classes. Assim, você poderá chamar tanto de uma quanto de outra.

Como o relacionamento é direto em uma tabela filho, na tabela de pessoas (relacionamento one-to-many) não usamos todos os argumentos para a chamada do método _addForeignRelation. Utilizamos somente os seguintes argumentos:

  • Nome do relacionamento: este servirá para poder chamar através do método getLink, recuperando todos os "carros" da pessoa carregada;
  • Tipo de relacionamento: indica o tipo de relacionamento que será usado. Poderá ser usado self::ONE_TO_MANY e self::MANY_TO_MANY. Mais abaixo veremos o segundo caso;
  • Nome da classe estrangeira: classe que será usada para carregar / linkar com a classe que está sendo usada. Ou seja, além de você poder carregar os objetos com o getLink, poderá usar o método join para realizar uma consulta utilizando cruzamento / relacionamento de tabelas.
  • Campo de linkagem da outra classe: Informa qual o nome do campo da entidade que está sendo manipulada (no caso, Carro), por exemplo: no mapemanto da classe Pessoa, temos como chave primária o campo idpessoa, e no mapeamento de Carro, temos o campo estrangeiro chamado pessoa. Logo, para que Pessoa saiba qual é o campo em Carro que será usado, informamos o nome do campo que está em Carro que faz referência à classe Pessoa. Em nosso exemplo, o campo pessoa na classe Carro é que faz referência à classe Pessoa no campo idpessoa.

Relacionamento many-to-many

Os relacionamentos many-to-many são feitos com uma tabela de união entre as outras duas. Esta tabela de união não requer mapeamento algum, visto que Lumine oferece suporte para trabalhar com este relacionamento a partir das entidades que possuem este tipo de relacionamento. No entanto, você pode fazer o mapeamento dela sem problema algum.

Vejamos o padrão para adicionar este tipo de relacionamento:

  1. $this->_addForeignRelation(String nome, int $tipo, String $class, String $nome_membro, String $tabela_uniao, String $nome_columa, Boolean $lazy = false);

Outro requerimento obrigatório, é que o relacionamento many-to-many deve existir em ambas entidades que irão possuir este tipo de relacionamento. Vamos continuar com nosso exemplo acima citado, e iremos construir um relacionamento many-to-many em ambas. Primeiro, em Pessoa:

  1. $this->_addForeignRelation('carros', self::MANY_TO_MANY, 'Carro', 'idpessoa', 'pessoas_carros', 'idpessoa', null);

Agora, em Carros:

  1. $this->_addForeignRelation('pessoas', self::MANY_TO_MANY, 'Pessoa', 'idcarro', 'pessoas_carros', 'idcarro', null);

Note que agora, com o relacionamento many-to-many, o quarto argumento ficou um pouco diferente. Ao invés de indicar qual o nome do campo na outra entidade, indicamos o nome do membro da própria classe que contém o relacionamento. Isto por que o carregamento dos objetos será feito através do campo da classe atual, e não da outra. Vejamos os outros argumentos, contando a partir do quinto (tabela de união):

  • Nome da tabela de União: tabela que servirá para unir os valores de referência de ambas as tabelas (carros e pessoas). Note que o nome dela, por padrão, é o nome da primeira, seguida de underline, seguido do nome da segunda tabela. Este é o padrão para Lumine reconhecer tabelas many-to-many.
  • Nome da coluna desta entidade na tabela de união: agora, você pode especificar qual é o nome da coluna na tabela de união que faz referência a chave primária da entidade em questão. Anteriormente, o nome da chave primária deveria ser o mesmo em ambas (no caso, se em Pessoa fosse idpessoa, então na tabela de união também deveria ser idpessoa). Agora, os nomes podem ser diferentes (por exemplo, somente id em Pessoa e idpessoa na tabela pessoas_carros);
  • Lazy (último argumento): Informa se os objetos serão carregados automaticamente quando o registro for da entidade pai for carregado.