O documento apresenta o ORM Doctrine para PHP, descrevendo suas principais características como mapeamento objeto-relacional, tarefas via linha de comando, caching, linguagem de consulta DQL e relacionamentos entre objetos.
Quem é você?Peão de fazenda por 6 anos Desenvolvedor Web desde 1998, PHP desde 2001 Responsável pelo site http://windows.php.net Membro do grupo ProPHP Desenvolvedor do core do Doctrine Commiter da framework PHP Symfony, Zend Framework, PHP-Doc, PHP-Wiki, PHP-Windows e PHP-Web, ... Apaixonado por jogos da série Age of Empires
4.
O que éORM? Da Wikipedia: “ Mapeamento objeto-relacional (ou ORM ) é uma técnica de desenvolvimento utilizada para reduzir a impedância da programação orientada aos objetos utilizando bancos de dados relacionais . As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.”
5.
Malditos Objetos! AplicaçõesPHP dependem mais de código OO Mas... Como recupero objetos do meu Banco? OO não mapeia naturalmente para SGBD Relacional: identificador, estado, comportamento, encapsulação, relacionamentos, atributos, etc Todo este sofrimento se resume à estas palavras simples em Inglês: “ impedance mismatch ”
6.
It’s RAD baby!Do dicionário: “ Slang and/or abbreviation for the word ‘radical’.” “ Calão e/ou abreviatura da palavra ‘radical’.” Da Wikipedia: “ Rapid application development (RAD) , é um modelo de processo de desenvolvimento de software iterativo e incremental que enfatiza um ciclo de desenvolvimento extremamente curto (entre 60 e 90 dias).”
7.
O que éDoctrine? Doctrine é uma ferramenta de ORM construída para trabalhar com PHP 5.2.3+ Baseada primariamente em Java Hibernate Influenciada por ActiveRecord do Ruby on Rails Projeto iniciado oficialmente em 2006 Versão 1.0 lançada em Setembro 2008
Fatos da vida...Por que eu deveria utilizar? Torna problemas difíceis muito mais fáceis Reduz tempo de desenvolvimento Reduz custo... E eu gosto de $$$! =) Resolvemos o problema da fome no mundo? Não, e também não resolve todos os seus problemas! Ajuda mais do que atrapalha Por que eu falei, p****!
10.
Recursos São tantos…Abstração da Base de Dados Tarefas (Tasks) via CLI Arquivos de Schema Data fixtures Caching DQL Listeners (Query, Record, Connection, …) Behaviors …
11.
Abstração da Basede Dados Doctrine depende de PDO e suporta qualquer driver que ela possui: Mysql Sqlite Pgsql Oracle Mssql Firebird Informix Implementando Connection e DataDict, você pode suportar outros drivers também
Tarefas via CLITarefas básicas de CLI Do Schema YAML para Modelos PHP php ./doctrine.php generate-models-yaml Gerando SQL a partir dos Modelos php ./doctrine.php generate-sql Gerando Tabelas no BD a partir dos Modelos php ./doctrine.php create-tables Carregando Data Fixture nas tabelas do BD php ./doctrine.php load-data Quer algo mais? Lista todas as tarefas e ajuda... php ./doctrine.php help
DQL DQL tornadifíceis consultas SQL simples Traz POO para suas consultas à base de dados Processada e convertida para seu SGBD específico Processamento da DQL é cacheado Funções de DB específicas também são suportadas. Expressões podem ser convertidas também
27.
Quero ver exemplo!FROM BlogPost p INNER JOIN p.Author a LEFT JOIN p.Tags t SELECT b.id AS b__id, b.title AS b__title, b.body AS b__body, b.author_id AS b__author_id, b.slug AS b__slug, b.created_at AS b__created_at, b.updated_at AS b__updated_at, a.id AS a__id, a.name AS a__name, t.id AS t__id, t.name AS t__name FROM blog_post b INNER JOIN author a ON b.author_id = a.id LEFT JOIN blog_post_tag b2 ON b.id = b2.blog_post_id LEFT JOIN tag t ON t.id = b2.tag_id
28.
Run Forest, run!php ./doctrine.php dql “FROM BlogPost b INNER JOIN b.Author a LEFT JOIN b.Tags t WHERE a.name = ?” “Guilherme Blanco”
29.
DQL php ./doctrine.phpdql “ SELECT bp.*, COUNT(t.id) AS num_tags FROM BlogPost bp LEFT JOIN bp.Tags t GROUP BY bp.id”
Relacionamentos simples Relacionamentossão como deveriam ser! ;) Diferentes tipos de relacionamento suportados: one2one one2many many2one many2many s elf Especifique relacionamentos de forma linear
39.
Relacionamentos tipo orgia!m2m Objeto de referência é usado de forma transparente Não é necessário referenciar o objeto manualmente Fácil de armazenar dados extras com tabelas de apoio
40.
Relacionamentos tipo orgia!m2m Fácil de se: relacionar (link) largar (unlink) Especifica novos objetos de forma linear Anexar objetos existentes
41.
Atualizando dados Recuperara atualizar Atualizar com uma consulta DQL Atualizações através de DQL não lançam eventos
O que aconteceu?Colunas automaticamente criadas Timestampable - Automaticamente define created_at e updated_at ao salvar Sluggable - Automaticamente cria um único e legível nome de identificação do objeto (slug)
48.
Futuro – Doctrine2.0 Praticamente reescrita total do código. PHP 5.3+ PHPUnit como Unit Test Suite Desacoplamento dos componentes Behaviors, Validators, YAML Schema, Data Fixtures, etc Separação total entre DBAL – ORM DQL Compiler Maior concentração em funcionalidades específicas de ORM