MAPEAMENTO OBJETO-RELACIONAL
   EM PHP COM OUTLET ORM



                       Fábio Rehm
O que é ORM?


Mapeamento objeto-relacional (ou ORM)
é uma técnica utilizada para reduzir as
dificuldades de se programar orientado a
objetos utilizando bancos de dados
relacionais.
                               (Wikipédia)
Diferenças
Relacional                OO
Diferenças
Relacional                OO
Diferenças
Relacional                OO
Diferenças
Relacional                OO
Diferenças
Relacional                OO




 ?
Diferenças
Relacional                OO




 ?
Diferenças
Relacional                OO




                          ?
Antigamente...
... era trabalhoso ...

 Baixa produtividade


                    X inúmeras
                      tabelas e
                      operações
... difícil de manter ...

 Duplicidade de código


                      X inúmeras
                        tabelas e
                        operações
... e difícil de modificar

Inviável substituir MySQL por outro banco
Soluções

 Banco de dados orientado a objetos
 Nem sempre OO é a melhor forma de se
  resolver um problema
 Mapeamento objeto-relacional:
   Table Data Gateway – Gateway de tabela
   Row Data Gateway – Gateway de linha de dados
   Active Record – Registro ativo
   Data Mapper – Mapeador de dados
       (Patterns of Enterprise Application Architecture, Martin Fowler)
Como funciona um ORM?

De forma simplificada:
 Classes são mapeadas em tabelas
 Instâncias (objetos) são (automaticamente)
  mapeadas em registros
Table Data Gateway
     http://martinfowler.com/eaaCatalog/tableDataGateway.html




 Uma classe por tabela
 Funções básicas de CRUD
 Pode implementar o relacionamento entre as
  tabelas
 Normalmente trabalha com arrays
Row Data Gateway
     http://martinfowler.com/eaaCatalog/rowDataGateway.html




 Classe para manipular uma linha da tabela
 Implementa apenas inserções e atualizações
Active Record
      http://martinfowler.com/eaaCatalog/activeRecord.html




 Semelhante ao Row Data Gateway
 Classes devem herdar de uma classe Registro
  que provê a funcionalidade básica
 Mistura de código para acesso a dados e
  lógica de domínio
Data Mapper
       http://martinfowler.com/eaaCatalog/dataMapper.html




 Persiste o modelo de objetos
 Mapeamento externo a classe
http://www.outlet-orm.org


 Pode ser visto como um conjunto de
    mapeadores de dados e tem o funcionamento
    semelhante ao (N)Hibernate
   Criado por Alvaro Carrasco (EUA) em ~2007
   Possui código aberto
   Consulta a objetos parecida com SQL
   Utiliza PDO “por baixo dos panos”
    http://br.php.net/manual/en/intro.pdo.php
   Banco de dados suportados:
     MySQL, PostgreSQL, SQLite, MS SQL (parcial)
simplicidade



10 arquivos
  +- 50 kb
liberdade




  ou
Requisitos

 PHP 5.1.6+
 Suporte a PDO para o banco de dados
  desejado
 PHP 5.2+ para suporte a objetos DateTime
Instalação

1.   Download
     http://www.outlet-orm.org/site/downloads
2.   Descompactar
3.   set_include_path(PASTA_DE_DESTINO.';' . get_include_path());
     (opcional)
Exemplo
Exemplo
Mapeamento
http://www.outlet-orm.org/manual/ch04.html
Mapeamento
http://www.outlet-orm.org/manual/ch04.html
Mapeamento
http://www.outlet-orm.org/manual/ch04.html
Mapeamento
http://www.outlet-orm.org/manual/ch04.html
Mapeamento em XML
http://groups.google.com.br/group/outlet-orm/files
Relacionamentos




              definição




              chave estrangeira



              definição
Relacionamentos
CRUD
CRUD
( mapa de identidade)
      http://martinfowler.com/eaaCatalog/identityMap.html




 Assegura que cada objeto seja carregado
  apenas uma única vez, mantendo cada objeto
  em um mapa.
CRUD
CRUD
CRUD - relacionamentos
Lazy loading
Fluent interface + Eager fetching
Futuro do projeto

 0.7 (versão corrente)
 1.0
   Ao que tudo indica será apenas a correção de bugs que já
      foram realizadas (svn/trunk) + suporte a múltiplas bases de
      dados
 2.0
     Suporte a chaves primárias compostas
     Unidade de trabalho
     Criação automática de tabelas
     …
 Plugin para eclipse
 Possível migração para Github (2.0 está indo para lá)
Unidade de trabalho
       http://martinfowler.com/eaaCatalog/identityMap.html




 Mantém uma lista de objetos afetados por
  uma transação de negócio
 Coordena a execução das ações (inserir,
  alterar, …)
Unidade de trabalho
Plugin para Eclipse
Referências:

 Patterns of Enterprise Application Architecture (Martin
  Fowler, 2003)
 http://www.slideshare.net/alegomes/mapeamento-or-
  com-hibernate
 http://www.slideshare.net/rob_knight/object-relational-
  mapping-in-php
Dúvidas?
Obrigado!
    Fábio Rehm

 fgrehm@gmail.com
  @fgrehm (twitter)

Mapeamento Objeto Relacional em PHP com Outlet ORM