SlideShare uma empresa Scribd logo
Versão .02
3
1
Quem sou eu
Desenvolvedor Web há 11 anos
11 anos com PHP
6 anos com JavaScript
Casado há 3 anos
Amante de Vôlei e Churrasco :)
2 . 1
Quem sou eu
2 . 2
O que é Propel?
3 . 1
O.R.M.
?
3 . 2
ORM Object-relational mapping
(Mapeamento objeto-relacional)
É 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.
Com esta técnica, o programador não precisa se
preocupar com os comandos em linguagem SQL; ele irá
usar uma interface de programação simples que faz todo
o trabalho de persistência.
- , WikiPédia
https://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional
3 . 3
O que é EXATAMENTE?
É um ORM de Código Aberto que permite acesso ao
banco de dados através de um set de objetos, provendo
assim uma API simplificada para armazenamento e
requisição de dados.
O que o difere de APENAS um ORM é que nativamente
provê Query-builder, Migrations, Engenharia reversa
de um banco já existente e um Gerador de model.
3 . 4
Um pouco de Teoria
O Propel 1 nasceu no início dos anos 2000(o primeiro
commit no Git foi em 2005)
O projeto do Propel nasceu baseado no Torque, uma
ferramenta que saiu do Apache Turbine.
Basicamente desde a versão 1 o propel implementa o
Pattern Active Record até metade da versão 2 onde
foram feito experimentos com Data Mapper.
A versão 3, criada em março de 2017, ainda em beta,
implementa tanto Active Record e Data Mapper.
3 . 5
Um pouco de Teoria
Um pouco controverso no ponto principal. Onde toda a
relação do banco é escrita via arquivos XML.
Todo o banco é escrito no XML, através de Ferramentas
CLI, é feito o processo de migration e Geração do Código
para as entidades.
Na versão 3, estão sendo feitos experimentos com
Annotations.
3 . 6
Do que é composto
XML
Para o esquema
do banco de
dados.
PHP 5.5+
Base de TUDO.
Symfony(Components)
Console
Yaml
Finder
Validator
Filesystem
4
Legal!!!
Mas... Por que eu deveria usa Propel, se já possuo
recursos em meu framework?
5 . 1
O Propel dá de presente para você, o Desenvolvedor
Web, ferramentas para trabalhar com bancos de dados
da mesma maneira que você trabalha com outras
classes e objetos em PHP sem escrever SQL.
Simples!
É super rápido(mesmo)
Se você usa IDE, ela te agradercerá por isso.
Tem um console muito phodástico.
Outros motivos que podem influenciar...
É bem documentado.
De brinde, existem comportamentos(behaviors)
Não é um casamento
5 . 2
Instalação/Configuração
$ composer require propel/propel:~2.0@dev
$ vendor/bin/propel init
$ vendor/bin/propel config:convert
$ vendor/bin/propel model:build
$ vendor/bin/propel migration:diff
$ vendor/bin/propel migration:migrate
6 . 1
Instalação/Configuração
6 . 2
Como utilizar?
Basicamente escrever(ou gerar) um
XML com a representação do banco.
<?xml version="1.0" encoding="UTF-8"?>
<database name="bookstore" defaultIdMethod="native">
<table name="book" phpName="Book">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="title" type="varchar" size="255" required="true" />
<column name="isbn" type="varchar" size="24" required="true" phpName="ISBN"/>
<column name="author_id" type="integer" required="true"/>
<foreign-key foreignTable="author">
<reference local="author_id" foreign="id"/>
</foreign-key>
</table>
<table name="author" phpName="Author">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="first_name" type="varchar" size="128" required="true"/>
<column name="last_name" type="varchar" size="128" required="true"/>
</table>
</database>
6 . 3
<?php
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/generated-conf/config.php';
$author = new DatabaseAuthor();
$author->setFirstName('Rafael');
$author->setLastName('DoGueto');
$author->save();
$q = new DatabaseAuthorQuery();
$primeiro = $q->findPK(1);
print_r($primeiro);
Como utilizar?
6 . 4
OK XML feito, como é o fucking código?
<?php
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/generated-conf/config.php';
$book = new Book();
$book->setTitle('Piadas Prontas');
$book->setIsbn('1234566654321');
$author = new Author();
$author->setFirstName('Rafael');
$author->setLastName('Nery');
$book->setAuthor($author);
$book->save();
print_r($book->toArray());
$q = new AuthorQuery();
$primeiro = $q->findPK(1);
print_r($primeiro);
Ainda existe Sandbox ;) - 6 . 5
C.R.U.D.
<?php
/* Incializar autoload, Propel, etc. */
$author = new Author();
$author->setFirstName('Rafael');
$author->setLastName('Nery');
$author->save();
Internamente será executado
INSERT INTO author (first_name, last_name) VALUES ('Rafael', 'Nery');
7 . 1
C.R.U.D.
<?php
/* Incializar autoload, Propel, etc. */
$q = new DatabaseAuthorQuery();
$primeiro = $q->findPK(1);
Internamente será executado
SELECT author.id, author.first_name, author.last_name
FROM `author`
WHERE author.id = 1
LIMIT 1;
7 . 2
C.R.U.D.
<?php
/* Incializar autoload, Propel, etc. */
use PropelRuntimePropel;
use PropelRuntimeFormatterObjectFormatter;
$con = Propel::getWriteConnection(MapBookTableMap::DATABASE_NAME);
$sql = "SELECT * FROM book WHERE id NOT IN "
."(SELECT book_review.book_id FROM book_review"
." INNER JOIN author ON (book_review.author_id=author.ID)"
." WHERE author.last_name = :name)";
$stmt = $con->prepare($sql);
$stmt->execute(array(':name' => 'Rafael'));
$formatter = new ObjectFormatter();
$formatter->setClass('Book'); //Com namespace
$books = $formatter->format($con->getDataFetcher($stmt));
Queryzinha marota na mão grande =)
7 . 3
C.R.U.D.
<?php
// primeira vez
$author1 = AuthorQuery::create()->findPk(1);
// SELECT query...
...
// segunda vez
$author2 = AuthorQuery::create()->findPk(1);
// Não roda a query e trás o objeto do author1
Queryzinha marota na mão grande =)
7 . 4
C.R.U.D.
<?php
$author = AuthorQuery::create()->findOneByFirstName('Rafael');
$author->setLastName('Nery');
$author->save();
// O Update pode ser feito na coleção
AuthorQuery::create()
->filterByFirstName('Rafael')
->update(array('LastName' => 'Nery'));
7 . 5
C.R.U.D.
<?php
$author = AuthorQuery::create()->findOneByFirstName('Rafael');
$author->delete();
//ou use na coleção
AuthorQuery::create()
->filterByFirstName('Rafael')
->delete();
7 . 6
Transações
<?php
use PropelRuntimePropel;
// ...
public function tranferenciaBancaria($fromAccountNumber, $toAccountNumber, $amount)
{
/// basta chamar a PDO
$con = Propel::getWriteConnection(AccountTableMap::DATABASE_NAME);
$fromAccount = AccountQuery::create()->findPk($fromAccountNumber, $con);
$toAccount = AccountQuery::create()->findPk($toAccountNumber, $con);
$con->beginTransaction();
try {
$fromAccount->setValue($fromAccount->getValue() - $amount);
$fromAccount->save($con);
$toAccount->setValue($toAccount->getValue() + $amount);
$toAccount->save($con);
$con->commit();
} catch (Exception $e) {
$con->rollback();
throw $e;
}
//:P
}
8 . 1
Transações
<?php
$con = Propel::getWriteConnection(
BookTableMap::DATABASE_NAME
);
for ($i=0; $i<2002; $i++)
{
$book = new Book();
$book->setTitle($i . ': A Space Odyssey');
$book->save($con);
}
BEGIN;
INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'0:
COMMIT;
BEGIN;
INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'1:
COMMIT;
BEGIN;
INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'2:
COMMIT;
...
<?php
$con = Propel::getWriteConnection(BookTableMap::DATABASE_NAME);
$con->beginTransaction();
for ($i=0; $i<2002; $i++)
{
$book = new Book();
$book->setTitle($i . ': A Space Odyssey');
$book->save($con);
}
$con->commit();
BEGIN;
INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'0:
INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'1:
INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'2:
...
COMMIT;
8 . 2
Callbacks
<table name="book">
...
<column name="data_criacao" type="timestamp" />
</table>
<?php
class Book extends BaseBook
{
public function preInsert(ConnectionInterface $con = null)
{
$this->setDataCriacao(time());
return true;
}
}
<?php
$b = new Book();
$b->setTitle('War And Peace');
$b->save();
echo $b->getDataCriacao(); // 1988-10-21 18:14:23
9
Slides: https://slides.com/rafaelnery
:wq
Perguntas?
10

Mais conteúdo relacionado

PDF
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
PDF
Cherrypy - um framework para desenvolvimento rápido de aplicações web
ODP
Oficina postgresql basico_consegi2010
PDF
12 aula - shell script-2015
PPT
Python cherrypy
PDF
Servidor de Aplicação Web: CherryPy - Python
PDF
Lista de exercícios em Bash (resolvida)
PDF
Introdução ao Shell Script (versão estendida)
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Oficina postgresql basico_consegi2010
12 aula - shell script-2015
Python cherrypy
Servidor de Aplicação Web: CherryPy - Python
Lista de exercícios em Bash (resolvida)
Introdução ao Shell Script (versão estendida)

Mais procurados (20)

PDF
Java recursos avançados - streams
ODP
Introducao ao Shell Script
PPSX
Cakephp 2.0 - O que mudou
PDF
Django Módulo Básico Parte II
PDF
Java recursos avançados - filters
PDF
Curso De Shell Aula 1
PDF
Fundamentos de Sockets
PPT
ANTLR-ANother Tool for Language Recognition
PDF
Tutorial Shell Script
PDF
Curso Gratuito de Shell Script
PPT
Apresentacao TCC - Rafael Felix
PDF
Gerando bindings de bibliotecas C++ para Python
PDF
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PDF
PHP Aula 05 - E-mails, Cookies e Sessoes
PDF
Dicas de java para iniciantes
PDF
Introdução ao php
PDF
Puppet 3 em 2017
Java recursos avançados - streams
Introducao ao Shell Script
Cakephp 2.0 - O que mudou
Django Módulo Básico Parte II
Java recursos avançados - filters
Curso De Shell Aula 1
Fundamentos de Sockets
ANTLR-ANother Tool for Language Recognition
Tutorial Shell Script
Curso Gratuito de Shell Script
Apresentacao TCC - Rafael Felix
Gerando bindings de bibliotecas C++ para Python
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP Aula 05 - E-mails, Cookies e Sessoes
Dicas de java para iniciantes
Introdução ao php
Puppet 3 em 2017
Anúncio

Semelhante a TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team at PHP. (20)

PDF
Ruby & Rails
PPTX
Isc aula 7
PPT
Desenvolvimento Agil Com Doctrine Orm
PDF
Palestra - Symfony Framework MVC PHP 5
PPTX
PDF
Solisc2009 Migrando de Oracle para Postgresql
PPT
Threads - .Net Framework 4.0
PPTX
Jpa, hibernate and jpql
PPTX
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
ODP
Entendendo Frameworks web com Python
ODP
Entendendo Framework Web com Python
PDF
Skytools, pgbouncer e plproxy
PDF
Curso de shell-tutorial avançadoIII .pdf
PDF
Desenvolvimento Web com Simfony Framework.
PPTX
Doctrine for dummies
PPTX
Comandos gerais do PHP
PPTX
Ferramentas open-source
PDF
Linguagem PHP
PPT
Apresentação faef
PDF
Palestra DataFlow - II São Paulo Perl Workshop
Ruby & Rails
Isc aula 7
Desenvolvimento Agil Com Doctrine Orm
Palestra - Symfony Framework MVC PHP 5
Solisc2009 Migrando de Oracle para Postgresql
Threads - .Net Framework 4.0
Jpa, hibernate and jpql
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
Entendendo Frameworks web com Python
Entendendo Framework Web com Python
Skytools, pgbouncer e plproxy
Curso de shell-tutorial avançadoIII .pdf
Desenvolvimento Web com Simfony Framework.
Doctrine for dummies
Comandos gerais do PHP
Ferramentas open-source
Linguagem PHP
Apresentação faef
Palestra DataFlow - II São Paulo Perl Workshop
Anúncio

Mais de tdc-globalcode (20)

PDF
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
PDF
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
PDF
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
PDF
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
PDF
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
PDF
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
PDF
TDC2019 Intel Software Day - Inferencia de IA em edge devices
PDF
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
PPT
Trilha .Net - Programacao funcional usando f#
PDF
TDC2018SP | Trilha Go - Case Easylocus
PDF
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
PDF
TDC2018SP | Trilha Go - Clean architecture em Golang
PDF
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
PDF
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
PDF
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
PDF
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
PDF
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
PDF
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
PDF
TDC2018SP | Trilha .Net - .NET funcional com F#
PDF
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - Inferencia de IA em edge devices
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha .Net - Programacao funcional usando f#
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core

Último (20)

PDF
A provisão de jojuador (ramadã) islamismo
PPTX
Reino Monera e Protista: representantes e caracteristicas.pptx
PPTX
Trabalho Cidades sustentáveis ou Utopia.pptx
PPTX
norma regulamentadora numero vinte nr 20
PDF
manual-orientacao-asb_5a8d6d8d87160aa636f63a5d0.pdf
PPT
História e Evolução dos Computadores domésticos
PDF
GESTÃO DA FASE PRÉ-ANALÍTICA- Recomendações da SBPC-ML (3).pdf
PPTX
biossegurança e segurança no trabalho (6).pptx
PPTX
MENDEL - Aula sobre Mendel - Genética EM
PPTX
Ocupação e transformação dos territórios.pptx
PDF
embriologia_animal_aula_share_2026_semestre
PDF
Combate a Incêndio - Estratégias e Táticas de Combate a Incêndio por Francis...
PPTX
GUERRAFRIA.pptdddddddddddddddddddddddddx
PDF
ESPELHOS DA ALMA A PSICOLOGIA POR TRÁS DOS CONTOS DE FADAS.pdf
PDF
FLUXOGRAMA CLASSE lll - Acesso estritamente proximal.pdf
PDF
Uma Introdução às Ciências do Alcorão (Islam)
PPTX
TREINAMENTO DE INSPETOR DE ANDAIMES.pptx
PDF
Cantores.pdf-Deslandes, Tinoco e Zambujo
PDF
50 anos Hoje - Volume V - 1973 - Manaus Amazonas
PDF
Formação politica brasil_2017.pptx.pdf
A provisão de jojuador (ramadã) islamismo
Reino Monera e Protista: representantes e caracteristicas.pptx
Trabalho Cidades sustentáveis ou Utopia.pptx
norma regulamentadora numero vinte nr 20
manual-orientacao-asb_5a8d6d8d87160aa636f63a5d0.pdf
História e Evolução dos Computadores domésticos
GESTÃO DA FASE PRÉ-ANALÍTICA- Recomendações da SBPC-ML (3).pdf
biossegurança e segurança no trabalho (6).pptx
MENDEL - Aula sobre Mendel - Genética EM
Ocupação e transformação dos territórios.pptx
embriologia_animal_aula_share_2026_semestre
Combate a Incêndio - Estratégias e Táticas de Combate a Incêndio por Francis...
GUERRAFRIA.pptdddddddddddddddddddddddddx
ESPELHOS DA ALMA A PSICOLOGIA POR TRÁS DOS CONTOS DE FADAS.pdf
FLUXOGRAMA CLASSE lll - Acesso estritamente proximal.pdf
Uma Introdução às Ciências do Alcorão (Islam)
TREINAMENTO DE INSPETOR DE ANDAIMES.pptx
Cantores.pdf-Deslandes, Tinoco e Zambujo
50 anos Hoje - Volume V - 1973 - Manaus Amazonas
Formação politica brasil_2017.pptx.pdf

TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team at PHP.

  • 2. Quem sou eu Desenvolvedor Web há 11 anos 11 anos com PHP 6 anos com JavaScript Casado há 3 anos Amante de Vôlei e Churrasco :) 2 . 1
  • 4. O que é Propel? 3 . 1
  • 6. ORM Object-relational mapping (Mapeamento objeto-relacional) É 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. Com esta técnica, o programador não precisa se preocupar com os comandos em linguagem SQL; ele irá usar uma interface de programação simples que faz todo o trabalho de persistência. - , WikiPédia https://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional 3 . 3
  • 7. O que é EXATAMENTE? É um ORM de Código Aberto que permite acesso ao banco de dados através de um set de objetos, provendo assim uma API simplificada para armazenamento e requisição de dados. O que o difere de APENAS um ORM é que nativamente provê Query-builder, Migrations, Engenharia reversa de um banco já existente e um Gerador de model. 3 . 4
  • 8. Um pouco de Teoria O Propel 1 nasceu no início dos anos 2000(o primeiro commit no Git foi em 2005) O projeto do Propel nasceu baseado no Torque, uma ferramenta que saiu do Apache Turbine. Basicamente desde a versão 1 o propel implementa o Pattern Active Record até metade da versão 2 onde foram feito experimentos com Data Mapper. A versão 3, criada em março de 2017, ainda em beta, implementa tanto Active Record e Data Mapper. 3 . 5
  • 9. Um pouco de Teoria Um pouco controverso no ponto principal. Onde toda a relação do banco é escrita via arquivos XML. Todo o banco é escrito no XML, através de Ferramentas CLI, é feito o processo de migration e Geração do Código para as entidades. Na versão 3, estão sendo feitos experimentos com Annotations. 3 . 6
  • 10. Do que é composto XML Para o esquema do banco de dados. PHP 5.5+ Base de TUDO. Symfony(Components) Console Yaml Finder Validator Filesystem 4
  • 11. Legal!!! Mas... Por que eu deveria usa Propel, se já possuo recursos em meu framework? 5 . 1
  • 12. O Propel dá de presente para você, o Desenvolvedor Web, ferramentas para trabalhar com bancos de dados da mesma maneira que você trabalha com outras classes e objetos em PHP sem escrever SQL. Simples! É super rápido(mesmo) Se você usa IDE, ela te agradercerá por isso. Tem um console muito phodástico. Outros motivos que podem influenciar... É bem documentado. De brinde, existem comportamentos(behaviors) Não é um casamento 5 . 2
  • 13. Instalação/Configuração $ composer require propel/propel:~2.0@dev $ vendor/bin/propel init $ vendor/bin/propel config:convert $ vendor/bin/propel model:build $ vendor/bin/propel migration:diff $ vendor/bin/propel migration:migrate 6 . 1
  • 15. Como utilizar? Basicamente escrever(ou gerar) um XML com a representação do banco. <?xml version="1.0" encoding="UTF-8"?> <database name="bookstore" defaultIdMethod="native"> <table name="book" phpName="Book"> <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> <column name="title" type="varchar" size="255" required="true" /> <column name="isbn" type="varchar" size="24" required="true" phpName="ISBN"/> <column name="author_id" type="integer" required="true"/> <foreign-key foreignTable="author"> <reference local="author_id" foreign="id"/> </foreign-key> </table> <table name="author" phpName="Author"> <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> <column name="first_name" type="varchar" size="128" required="true"/> <column name="last_name" type="varchar" size="128" required="true"/> </table> </database> 6 . 3
  • 16. <?php require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/generated-conf/config.php'; $author = new DatabaseAuthor(); $author->setFirstName('Rafael'); $author->setLastName('DoGueto'); $author->save(); $q = new DatabaseAuthorQuery(); $primeiro = $q->findPK(1); print_r($primeiro); Como utilizar? 6 . 4
  • 17. OK XML feito, como é o fucking código? <?php require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/generated-conf/config.php'; $book = new Book(); $book->setTitle('Piadas Prontas'); $book->setIsbn('1234566654321'); $author = new Author(); $author->setFirstName('Rafael'); $author->setLastName('Nery'); $book->setAuthor($author); $book->save(); print_r($book->toArray()); $q = new AuthorQuery(); $primeiro = $q->findPK(1); print_r($primeiro); Ainda existe Sandbox ;) - 6 . 5
  • 18. C.R.U.D. <?php /* Incializar autoload, Propel, etc. */ $author = new Author(); $author->setFirstName('Rafael'); $author->setLastName('Nery'); $author->save(); Internamente será executado INSERT INTO author (first_name, last_name) VALUES ('Rafael', 'Nery'); 7 . 1
  • 19. C.R.U.D. <?php /* Incializar autoload, Propel, etc. */ $q = new DatabaseAuthorQuery(); $primeiro = $q->findPK(1); Internamente será executado SELECT author.id, author.first_name, author.last_name FROM `author` WHERE author.id = 1 LIMIT 1; 7 . 2
  • 20. C.R.U.D. <?php /* Incializar autoload, Propel, etc. */ use PropelRuntimePropel; use PropelRuntimeFormatterObjectFormatter; $con = Propel::getWriteConnection(MapBookTableMap::DATABASE_NAME); $sql = "SELECT * FROM book WHERE id NOT IN " ."(SELECT book_review.book_id FROM book_review" ." INNER JOIN author ON (book_review.author_id=author.ID)" ." WHERE author.last_name = :name)"; $stmt = $con->prepare($sql); $stmt->execute(array(':name' => 'Rafael')); $formatter = new ObjectFormatter(); $formatter->setClass('Book'); //Com namespace $books = $formatter->format($con->getDataFetcher($stmt)); Queryzinha marota na mão grande =) 7 . 3
  • 21. C.R.U.D. <?php // primeira vez $author1 = AuthorQuery::create()->findPk(1); // SELECT query... ... // segunda vez $author2 = AuthorQuery::create()->findPk(1); // Não roda a query e trás o objeto do author1 Queryzinha marota na mão grande =) 7 . 4
  • 22. C.R.U.D. <?php $author = AuthorQuery::create()->findOneByFirstName('Rafael'); $author->setLastName('Nery'); $author->save(); // O Update pode ser feito na coleção AuthorQuery::create() ->filterByFirstName('Rafael') ->update(array('LastName' => 'Nery')); 7 . 5
  • 23. C.R.U.D. <?php $author = AuthorQuery::create()->findOneByFirstName('Rafael'); $author->delete(); //ou use na coleção AuthorQuery::create() ->filterByFirstName('Rafael') ->delete(); 7 . 6
  • 24. Transações <?php use PropelRuntimePropel; // ... public function tranferenciaBancaria($fromAccountNumber, $toAccountNumber, $amount) { /// basta chamar a PDO $con = Propel::getWriteConnection(AccountTableMap::DATABASE_NAME); $fromAccount = AccountQuery::create()->findPk($fromAccountNumber, $con); $toAccount = AccountQuery::create()->findPk($toAccountNumber, $con); $con->beginTransaction(); try { $fromAccount->setValue($fromAccount->getValue() - $amount); $fromAccount->save($con); $toAccount->setValue($toAccount->getValue() + $amount); $toAccount->save($con); $con->commit(); } catch (Exception $e) { $con->rollback(); throw $e; } //:P } 8 . 1
  • 25. Transações <?php $con = Propel::getWriteConnection( BookTableMap::DATABASE_NAME ); for ($i=0; $i<2002; $i++) { $book = new Book(); $book->setTitle($i . ': A Space Odyssey'); $book->save($con); } BEGIN; INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'0: COMMIT; BEGIN; INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'1: COMMIT; BEGIN; INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'2: COMMIT; ... <?php $con = Propel::getWriteConnection(BookTableMap::DATABASE_NAME); $con->beginTransaction(); for ($i=0; $i<2002; $i++) { $book = new Book(); $book->setTitle($i . ': A Space Odyssey'); $book->save($con); } $con->commit(); BEGIN; INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'0: INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'1: INSERT INTO book (`ID`,`TITLE`) VALUES (NULL,'2: ... COMMIT; 8 . 2
  • 26. Callbacks <table name="book"> ... <column name="data_criacao" type="timestamp" /> </table> <?php class Book extends BaseBook { public function preInsert(ConnectionInterface $con = null) { $this->setDataCriacao(time()); return true; } } <?php $b = new Book(); $b->setTitle('War And Peace'); $b->save(); echo $b->getDataCriacao(); // 1988-10-21 18:14:23 9