HUFERSIL.WEBDEVELOPER

Relacionamentos 1-N e M-N

Como havia dito antes, vou mostar um exemplo de uso com relacionamentos.
Neste exemplo, estou assumindo que:

O objetivo é mostrar como os relacionamentos podem ser criados com Lumine, de forma rápida e orientada a objetos.

Iniciando

Antes de prosseguir, é importante que você tenha seu banco de dados criado e populado.
Abaixo estão os dados que vamos usar como exemplo:

-- MySQL dump 10.13  Distrib 5.1.34, for Win32 (ia32)
--
-- Host: localhost    Database: lumine
-- ------------------------------------------------------
-- Server version	5.1.34-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `modulo`
--

DROP TABLE IF EXISTS `modulo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `modulo` (
  `idmodulo` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) NOT NULL,
  `url` varchar(100) NOT NULL,
  PRIMARY KEY (`idmodulo`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `modulo`
--

LOCK TABLES `modulo` WRITE;
/*!40000 ALTER TABLE `modulo` DISABLE KEYS */;
INSERT INTO `modulo` VALUES (1,'Home','index.php'),(2,'Administracao','admin.php'),(3,'Mais um modulo legal','legal.php');
/*!40000 ALTER TABLE `modulo` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `pessoa`
--

DROP TABLE IF EXISTS `pessoa`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `pessoa` (
  `idpessoa` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `data_cadastro` datetime NOT NULL,
  PRIMARY KEY (`idpessoa`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `pessoa`
--

LOCK TABLES `pessoa` WRITE;
/*!40000 ALTER TABLE `pessoa` DISABLE KEYS */;
INSERT INTO `pessoa` VALUES (1,'Hugo Ferreira da Silva','hufersil@gmail.com','2009-07-13 16:11:56'),(2,'Mirian Brisch da Silva','mirian@gmail.com','2009-07-13 13:19:07'),(3,'João Francisco','joao@gmail.com','2009-07-13 13:19:31'),(4,'Juliano','juliano.polito@247id.com.br','2009-07-13 13:06:19'),(5,'Macarena','macarena@gmail.com','2009-07-13 13:18:04');
/*!40000 ALTER TABLE `pessoa` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `pessoa_modulo`
--

DROP TABLE IF EXISTS `pessoa_modulo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `pessoa_modulo` (
  `idpessoa` int(10) unsigned NOT NULL,
  `idmodulo` int(10) unsigned NOT NULL,
  PRIMARY KEY (`idpessoa`,`idmodulo`),
  KEY `FK_pessoa_modulo_2` (`idmodulo`),
  CONSTRAINT `FK_pessoa_modulo_1` FOREIGN KEY (`idpessoa`) REFERENCES `pessoa` (`idpessoa`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_pessoa_modulo_2` FOREIGN KEY (`idmodulo`) REFERENCES `modulo` (`idmodulo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `pessoa_modulo`
--

LOCK TABLES `pessoa_modulo` WRITE;
/*!40000 ALTER TABLE `pessoa_modulo` DISABLE KEYS */;
INSERT INTO `pessoa_modulo` VALUES (1,1),(2,1),(1,2),(3,2),(1,3);
/*!40000 ALTER TABLE `pessoa_modulo` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `telefone`
--

DROP TABLE IF EXISTS `telefone`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `telefone` (
  `idtelefone` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `numero` varchar(20) NOT NULL,
  `idpessoa` int(10) unsigned NOT NULL,
  PRIMARY KEY (`idtelefone`),
  KEY `FK_telefone_1` (`idpessoa`),
  CONSTRAINT `FK_telefone_1` FOREIGN KEY (`idpessoa`) REFERENCES `pessoa` (`idpessoa`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `telefone`
--

LOCK TABLES `telefone` WRITE;
/*!40000 ALTER TABLE `telefone` DISABLE KEYS */;
INSERT INTO `telefone` VALUES (1,'7777-7777',1),(2,'6666-6666',1),(3,'5555-5555',2),(4,'4444-4444',1);
/*!40000 ALTER TABLE `telefone` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2009-07-14 21:27:05

Agora, faça uma engenharia reversa do banco de dados.

Exemplificando – relacionamentos N-M

Tenha sempre em mente que o objeto principal que está sendo usado é sua fonte primária de dados.
Por exemplo: supondo que você quer todos os módulos que uma pessoa tem acesso, seu objeto principal será o que representa a tabela modulo (quero todos os módulos de uma pessoa).

Em nosso exemplo, existe um relacionamento N-M entre pessoa e módulo, sendo representado pela tabela pessoa_modulo. Se você notar, a engenharia reversa não criou a entidade para esta tabela (a não ser que você tenha escolhido para que ela gerasse). Isso porque Lumine gerencia automaticamente os dados que são gravados nesta tabela, através do relacionamento mapeado nos objetos Pessoa e Modulo.

Então, uma exemplo de consulta para este caso seria:

// altera o alias de modulo
$modulo->alias('m')
	// une com modulo - automaticamente lumine ira unir
	// com a tabela pessoa_modulo
	->join($pessoa,'inner','p')
	// forcamos pegar somente os dados do modulo
	->selectAs()
	// indica de qual pessoa queremos os modulos
	->where('p.idpessoa = ?', 1)
	// efetua a consulta
	->find();

 

Agora, supondo que você quer o inverso: todas as pessoas de um determinado módulo, seu objeto principal seria o objeto pessoa, logo:

$pessoa->alias('p')
	// une com modulo - automaticamente lumine ira unir
	// com a tabela pessoa_modulo
	->join($modulo,'inner','m')
	// forcamos pegar somente os dados de pessoa
	->selectAs()
	// indica de qual modulo queremos as pessoas
	->where('m.idmodulo = ?', 1)
	// efetua a consulta
	->find();

Exemplificando – relacionamentos 1-N

Aqui já é mais fácil porque você tem um relacionamento direto entre as tabelas que contém os dados.
Supondo que você quer pegar todos os telefones e o nome de cada número:

// muda o alias de telefone
$telefone->alias('t')
	// une com um novo objeto de pessoa
	->join(new Pessoa(),'inner','p')
	// pega o nome e numero
	->select('p.nome, t.numero')
	// ordena pelo nome
	->order('p.nome')
	// efetua a consulta
	->find();

Encadeamento de chamadas

Em alguns casos você precisará fazer joins aninhados, de várias classes diferentes. Lumine permite que você faça isso.
Abaixo um exemplo simples. Obs.: Este exemplo é somente para mostrar que é possível fazer encadeamento de chamadas. Na vida real, este exemplo não traria dados relevantes:

// altera o alias de modulo
$modulo->alias('m')
	// une com pessoa... ja mudando seu alias
	->join($pessoa->alias('p')
		// une pessoa com telefone
		->join($telefone,'inner','t')
	)
	// efetua a consulta
	->find();

Espero que estes pequenos exemplos ajudem a melhorar o conhecimento e utilização de Lumine.

E os arquivos encontram-se disponíveis para download.

@braços e fiquem com Deus!

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">