SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
Doctrine: Co dělat,
když entity nestačí?
@ProchazkaFilip
#makeCodeNotWar
Co si povíme?
● minimum využití databáze každého Doctrinisty
● batch operace
● rozšiřování DQL
● metody hydratace
● native queries
#makeCodeNotWar
Minimum využití databáze
každého Doctrinisty
Minimum využití databáze každého Doctrinisty
● Co za vás dělá Doctrine
○ indexy pro vazby a primární klíče
○ vzdálené klíče
● Co si musíte pohlídat sami
○ unique indexy
○ vlastní typy
Indexy a vzdálené klíče
class User {
/**
* @ORMId()
* @ORMColumn(type="uuid")
*/
private $id;
class Order {
/**
* @ORMManyToOne(targetEntity=User::class)
* @ORMJoinColumn(nullable=false)
*/
private $user;
Unique indexy
class User {
/**
* @ORMColumn(type="string", unique=true)
*/
private $email;
Unique indexy
/**
* @ORMEntity()
* @ORMTable(name="order_item_rating",
* uniqueConstraints={
* @ORMUniqueConstraint(name="order_item_rating_x_unique", columns={
* "order_item_id", "user_id"
* })
* }
* )
*/
class OrderItemRating
Unique indexy: vkládání a race conditions
● Opravdu to potřebujete řešit?
○ >90% aplikacím stačí check přes repository před flushem
○ >90% aplikací nikdy nenaroste natolik, aby to byl skutečný problém
● Pokud to opravdu opravdu potřebujete řešit
○ kdyby/doctrine ... NonLockingUniqueInserter
○ ^ brzy i samostatně, jako kdyby/doctrine-nonlocking-unique-inserter
○ ^ Symfony friendly ❤
○ ^ sledujte issue kdyby/doctrine#238
Vlastní datový typ
class UuidType extends Type {
const NAME = 'uuid';
function getName() { return self::NAME; }
function getSQLDeclaration(
array $fieldDeclaration, AbstractPlatform $platform);
function convertToPHPValue(
$value, AbstractPlatform $platform);
function convertToDatabaseValue(
$value, AbstractPlatform $platform);
Zdroj: ramsey/uuid-doctrine
Vlastní datový typ: komentáře ve schématu
class SomethingBasedOnStringType extends StringType {
function requiresSQLCommentHint(
AbstractPlatform $platform) : bool
// …
$platform->markDoctrineTypeCommented(Type::getType($type));
Vlastní datový typ: konverze na úrovni DB
class GeometryType extends Type {
function canRequireSQLConversion() : bool;
function convertToDatabaseValueSQL(
$sqlExpr, AbstractPlatform $platform);
function convertToPHPValueSQL(
$sqlExpr, $platform);
Vlastní datový typ: registrace
doctrine:
dbal:
types:
uuid:
class: RamseyUuidDoctrineUuidType
Zdroj: ramsey/uuid-doctrine
Vlastní datový typ: použití
/**
* @ORMId()
* @ORMColumn(type="uuid")
*/
private $id;
CREATE TABLE "user" (
id UUID NOT NULL,
email VARCHAR(255) DEFAULT NULL
-- atd
);
COMMENT ON COLUMN "user".id
IS '(DC2Type:uuid)';
Logika v databázi
vs
Logika v modelu
Premature optimization is the root of all evil ~ Donald Knuth
Batch operace
Batch operace s DQL
“UPDATE/DELETE statements are ported directly into a Database statement and
therefore bypass any locking scheme, events and do not increment the
version column. Entities that are already loaded into the persistence context will
NOT be synced with the updated database state. It is recommended to call
EntityManager#clear() and retrieve new instances of any affected entity.”
~ Dokumentace
Batch operace s DQL
● Zkuste nejprve chytřejší způsoby iterace nad výsledkem
○ ORMQuery::iterate();
○ Stránkování
● Raději DQL update, než SQL update
● Neumí JOINy :(
Batch operace s DQL
$select = $em->createQueryBuilder()
->addSelect('orderItem.price')
->from(OrderItem::class, 'orderItem')
->andWhere('orderItem.order = theOrder.id');
$update = $em->createQueryBuilder()
->update(Order::class, 'theOrder')
->set('theOrder.totalPrice', sprintf('(%s)', $select))
->getQuery();
Batch operace s DQL
UPDATE "order"
SET total_price = (
SELECT SUM(o0_.price) AS dctrn__1
FROM order_item o0_
WHERE o0_.order_id = order.id
)
Batch operace s DBAL
● $connection->prepare('UPDATE ...');
● $connection->createQueryBuilder();
Rozšiřování DQL
Rozšiřování DQL
● TreeWalker - může modifikovat AST
● output SqlWalker - generuje samotný SQL dotaz
● vlastní funkce
Rozšiřování DQL: limitace
● Gramatika je jasně definovaná, není možné to nijak ohackovat
● Tree Walker může modifikovat výsledné AST, ale opět nezmění gramatiku
● SqlWalker to nemá jak zachránit
Rozšiřování DQL: co jde
Kam nemůže DQL
SELECT order.finishedTime IS NULL AS something
FROM ...;
Tam musí funkce
SELECT IS_NULL(order.finishedTime) AS something
FROM ...;
Rozšiřování DQL: vlastní funkce
class IsNull extends FunctionNode {
private $expression;
public function getSql(SqlWalker $sqlWalker) {
return $sqlWalker->walkArithmeticPrimary($this->expression) . ' IS NULL';
}
public function parse(Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->expression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
SELECT employee,
AVG(salary) OVER (PARTITION BY employee.department) AS avgSalary
FROM MyEmployee employee;
SELECT employee,
WINDOW_OVER(AVG(salary), employee.department) AS avgSalary
FROM MyEmployee employee;
SELECT employee,
WINDOW(AVG(salary) OVER (PARTITION BY employee.department)) AS avgSalary
FROM MyEmployee employee;
Rozšiřování DQL: komplexnější syntaxe
Rozšiřování DQL: existující knihovny
● oro/doctrine-extensions (MySQL, PostgreSQL)
● opsway/doctrine-dbal-postgresql (PostgreSQL)
● beberlei/DoctrineExtensions (MySQL, Oracle)
● syslogic/doctrine-json-functions (MySQL)
● další na: https://packagist.org/search/?q=dql
Hydratace
Druhy hydratace
● entity
○ ORMQuery::getResult();
● scalar + entity (mixed results)
○ ORMQuery::getResult();
● array - vytvoří strukturu jako pro entity a tu vrátí
○ ORMQuery::getArrayResult();
● scalar - přejmenuje sloupce na fieldy a přetypuje
○ ORMQuery::getScalarResult();
Native queries
$rsm = new ResultSetMappingBuilder($em);
$rsm->addRootEntityFromClassMetadata(OrderItem::class, 'order_item')
$connection->createQueryBuilder()
->addSelect($rsm->generateSelectClause())
->from(...)
$em->createNativeQuery($sql, $rsm)
Shrnutí: co si z toho odnést?
● Logika v modelu dokud to jenom trochu jde
● Nebát se využívat hojně vlastní typy
● Rozšiřování DQL je snadné
● Doctrine není určená na batch operace
Kam dál?
● Youtube kanál “Nette Framework” > search “Doctrine”
Dotazy?
Díky za pozornost!
@ProchazkaFilip
#makeCodeNotWar
Díky za pozornost!
@ProchazkaFilip
#makeCodeNotWar

Weitere ähnliche Inhalte

Was ist angesagt?

CRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná APICRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná APIPremek Brada
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)Martin Zeman
 
Aplikační nastavení v .NET
Aplikační nastavení v .NETAplikační nastavení v .NET
Aplikační nastavení v .NETJan Hřídel
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace Jan Hřídel
 
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJosef Kříž
 

Was ist angesagt? (10)

Clean code
Clean codeClean code
Clean code
 
CRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná APICRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná API
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Aplikační nastavení v .NET
Aplikační nastavení v .NETAplikační nastavení v .NET
Aplikační nastavení v .NET
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace
 
Drupal Front-end
Drupal Front-endDrupal Front-end
Drupal Front-end
 
Spring dao
Spring daoSpring dao
Spring dao
 
ADO.NET
ADO.NETADO.NET
ADO.NET
 
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
 

Andere mochten auch

Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)Péhápkaři
 
Jak jsme přepisovali Jobs.cz na Symfony
Jak jsme přepisovali Jobs.cz na SymfonyJak jsme přepisovali Jobs.cz na Symfony
Jak jsme přepisovali Jobs.cz na SymfonyOndřej Machulda
 
Réglement du pos
Réglement du posRéglement du pos
Réglement du posSami Sahli
 
Présentation1
Présentation1Présentation1
Présentation1ch-br
 
PDR Presentation with Updated Requirements Slides.pptx
PDR Presentation with Updated Requirements Slides.pptxPDR Presentation with Updated Requirements Slides.pptx
PDR Presentation with Updated Requirements Slides.pptxTristan Roberts
 
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...Péhápkaři
 
Etude Adyoulike/Ifop "Les français et la publicité en ligne"
Etude Adyoulike/Ifop "Les français et la publicité en ligne"Etude Adyoulike/Ifop "Les français et la publicité en ligne"
Etude Adyoulike/Ifop "Les français et la publicité en ligne"Cedric Buisson
 
Carlos Navas Resume
Carlos Navas ResumeCarlos Navas Resume
Carlos Navas ResumeCarlos Navas
 
Cours de fiscalité fsjes maroc www.cours-economie.com
Cours de fiscalité fsjes maroc www.cours-economie.comCours de fiscalité fsjes maroc www.cours-economie.com
Cours de fiscalité fsjes maroc www.cours-economie.comjamal yasser
 
la grande mosquée du Cordoue
la grande mosquée du Cordouela grande mosquée du Cordoue
la grande mosquée du CordoueSami Sahli
 
Retour sur 5 ans au service des élus
Retour sur 5 ans au service des élusRetour sur 5 ans au service des élus
Retour sur 5 ans au service des élusOlivier Tisserant
 
Exercices d analyse financière s4
Exercices d analyse financière s4 Exercices d analyse financière s4
Exercices d analyse financière s4 Jamal Yasser
 
Humanisme et Renaissance, imprimerie.doc
Humanisme et Renaissance, imprimerie.docHumanisme et Renaissance, imprimerie.doc
Humanisme et Renaissance, imprimerie.docxandrey
 
Teaching debate skills
Teaching debate skillsTeaching debate skills
Teaching debate skillsHung Pham
 

Andere mochten auch (16)

Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
 
Jak jsme přepisovali Jobs.cz na Symfony
Jak jsme přepisovali Jobs.cz na SymfonyJak jsme přepisovali Jobs.cz na Symfony
Jak jsme přepisovali Jobs.cz na Symfony
 
Réglement du pos
Réglement du posRéglement du pos
Réglement du pos
 
Présentation1
Présentation1Présentation1
Présentation1
 
PDR Presentation with Updated Requirements Slides.pptx
PDR Presentation with Updated Requirements Slides.pptxPDR Presentation with Updated Requirements Slides.pptx
PDR Presentation with Updated Requirements Slides.pptx
 
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
Jindřich Kubát - Microservice – Post Monolith Architecture (11. sraz přátel P...
 
Etude Adyoulike/Ifop "Les français et la publicité en ligne"
Etude Adyoulike/Ifop "Les français et la publicité en ligne"Etude Adyoulike/Ifop "Les français et la publicité en ligne"
Etude Adyoulike/Ifop "Les français et la publicité en ligne"
 
Carlos Navas Resume
Carlos Navas ResumeCarlos Navas Resume
Carlos Navas Resume
 
RFM analýza
RFM analýzaRFM analýza
RFM analýza
 
Cours de fiscalité fsjes maroc www.cours-economie.com
Cours de fiscalité fsjes maroc www.cours-economie.comCours de fiscalité fsjes maroc www.cours-economie.com
Cours de fiscalité fsjes maroc www.cours-economie.com
 
la grande mosquée du Cordoue
la grande mosquée du Cordouela grande mosquée du Cordoue
la grande mosquée du Cordoue
 
Retour sur 5 ans au service des élus
Retour sur 5 ans au service des élusRetour sur 5 ans au service des élus
Retour sur 5 ans au service des élus
 
Exercices d analyse financière s4
Exercices d analyse financière s4 Exercices d analyse financière s4
Exercices d analyse financière s4
 
Humanisme et Renaissance, imprimerie.doc
Humanisme et Renaissance, imprimerie.docHumanisme et Renaissance, imprimerie.doc
Humanisme et Renaissance, imprimerie.doc
 
Teaching debate skills
Teaching debate skillsTeaching debate skills
Teaching debate skills
 
Speculative Fiction
Speculative FictionSpeculative Fiction
Speculative Fiction
 

Ähnlich wie Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)

Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)Martin Hujer
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)Péhápkaři
 
Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Jan Hřídel
 
Prague data management meetup 2017-05-16
Prague data management meetup 2017-05-16Prague data management meetup 2017-05-16
Prague data management meetup 2017-05-16Martin Bém
 
Slovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceSlovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceMartin Cerveny
 
.NET v SQL Serveru
.NET v SQL Serveru.NET v SQL Serveru
.NET v SQL ServeruJan Drozen
 
Tv 10 11
Tv 10 11Tv 10 11
Tv 10 11352
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Martin Cerveny
 
Vývoj aplikací pro iOS
Vývoj aplikací pro iOSVývoj aplikací pro iOS
Vývoj aplikací pro iOSPetr Dvorak
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaJan Hřídel
 

Ähnlich wie Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha) (14)

201502.ReinIT.Dev
201502.ReinIT.Dev201502.ReinIT.Dev
201502.ReinIT.Dev
 
Django
DjangoDjango
Django
 
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#
 
Prague data management meetup 2017-05-16
Prague data management meetup 2017-05-16Prague data management meetup 2017-05-16
Prague data management meetup 2017-05-16
 
Slovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceSlovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTrace
 
.NET v SQL Serveru
.NET v SQL Serveru.NET v SQL Serveru
.NET v SQL Serveru
 
Úvod do rails
Úvod do railsÚvod do rails
Úvod do rails
 
Tv 10 11
Tv 10 11Tv 10 11
Tv 10 11
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace
 
Vývoj aplikací pro iOS
Vývoj aplikací pro iOSVývoj aplikací pro iOS
Vývoj aplikací pro iOS
 
Mesour DataGrid
Mesour DataGridMesour DataGrid
Mesour DataGrid
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáška
 

Mehr von Péhápkaři

Startup vs korporace vs Previo
Startup vs korporace vs PrevioStartup vs korporace vs Previo
Startup vs korporace vs PrevioPéhápkaři
 
RabbitMQ a ElasticSearch v Previu
RabbitMQ a ElasticSearch v PreviuRabbitMQ a ElasticSearch v Previu
RabbitMQ a ElasticSearch v PreviuPéhápkaři
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Péhápkaři
 
Čtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán ZikmundČtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán ZikmundPéhápkaři
 
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...Péhápkaři
 
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)Péhápkaři
 
PHP Evening #1 - Automatizace [Jan Klat]
PHP Evening #1 - Automatizace [Jan Klat]PHP Evening #1 - Automatizace [Jan Klat]
PHP Evening #1 - Automatizace [Jan Klat]Péhápkaři
 
PHP Evening #1 - Propel ORM [Martin Sojka]
PHP Evening #1 - Propel ORM [Martin Sojka]PHP Evening #1 - Propel ORM [Martin Sojka]
PHP Evening #1 - Propel ORM [Martin Sojka]Péhápkaři
 
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...Péhápkaři
 
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...Péhápkaři
 
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...Péhápkaři
 
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy (11. sraz přátel ...
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy  (11. sraz přátel ...Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy  (11. sraz přátel ...
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy (11. sraz přátel ...Péhápkaři
 
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...Péhápkaři
 
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)Péhápkaři
 
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)Péhápkaři
 
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)Péhápkaři
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Péhápkaři
 
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)Péhápkaři
 
Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)
Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)
Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)Péhápkaři
 
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Péhápkaři
 

Mehr von Péhápkaři (20)

Startup vs korporace vs Previo
Startup vs korporace vs PrevioStartup vs korporace vs Previo
Startup vs korporace vs Previo
 
RabbitMQ a ElasticSearch v Previu
RabbitMQ a ElasticSearch v PreviuRabbitMQ a ElasticSearch v Previu
RabbitMQ a ElasticSearch v Previu
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
 
Čtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán ZikmundČtvrtkon #53 - Štěpán Zikmund
Čtvrtkon #53 - Štěpán Zikmund
 
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
Václav Makeš - Infrastructure as code - Jak nahazovat stroje a nic moc nevědě...
 
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
Tomáš Klíma - Implementace BitCoinut v praxi (13. sraz přátel PHP v Praze)
 
PHP Evening #1 - Automatizace [Jan Klat]
PHP Evening #1 - Automatizace [Jan Klat]PHP Evening #1 - Automatizace [Jan Klat]
PHP Evening #1 - Automatizace [Jan Klat]
 
PHP Evening #1 - Propel ORM [Martin Sojka]
PHP Evening #1 - Propel ORM [Martin Sojka]PHP Evening #1 - Propel ORM [Martin Sojka]
PHP Evening #1 - Propel ORM [Martin Sojka]
 
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
Tomáš Kazatel - Jsme přece vývojáři, ne textaři (12. sraz přátel PHP v P...
 
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
Jakub Kratina - Když si dva vývojáři založí s.r.o. (12. sraz přátel PHP v Pra...
 
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
Petr Pavel - Co musí programátor umět kromě programování (12. sraz přátel PHP...
 
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy (11. sraz přátel ...
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy  (11. sraz přátel ...Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy  (11. sraz přátel ...
Tomáš Strejček - Velikost týmu vs. monolith a mikroservicy (11. sraz přátel ...
 
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
Jakub Kratina - Jak testovat aplikace s radostí díky Codeception (11. sraz př...
 
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
Ako nespáliť server - Monit [Jozef Lami] (7. sraz, Praha)
 
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
Blackfire.io - Fire up your php app performance [Jan Kopp] (7. sraz, Praha)
 
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
Automatizace jednoduše [Martin Zeman] (6. sraz, Praha, 31.3.2016)
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
 
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
Karel Škopek - WordPress + Laravel = <3 (4. sraz přátel Symfony v Praze)
 
Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)
Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)
Tomáš Fejfar - Elk - Víc než jen logy (4. sraz přátel Symfony v Praze)
 
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
 

Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)

  • 1. Doctrine: Co dělat, když entity nestačí? @ProchazkaFilip #makeCodeNotWar
  • 2. Co si povíme? ● minimum využití databáze každého Doctrinisty ● batch operace ● rozšiřování DQL ● metody hydratace ● native queries #makeCodeNotWar
  • 4. Minimum využití databáze každého Doctrinisty ● Co za vás dělá Doctrine ○ indexy pro vazby a primární klíče ○ vzdálené klíče ● Co si musíte pohlídat sami ○ unique indexy ○ vlastní typy
  • 5. Indexy a vzdálené klíče class User { /** * @ORMId() * @ORMColumn(type="uuid") */ private $id; class Order { /** * @ORMManyToOne(targetEntity=User::class) * @ORMJoinColumn(nullable=false) */ private $user;
  • 6. Unique indexy class User { /** * @ORMColumn(type="string", unique=true) */ private $email;
  • 7. Unique indexy /** * @ORMEntity() * @ORMTable(name="order_item_rating", * uniqueConstraints={ * @ORMUniqueConstraint(name="order_item_rating_x_unique", columns={ * "order_item_id", "user_id" * }) * } * ) */ class OrderItemRating
  • 8. Unique indexy: vkládání a race conditions ● Opravdu to potřebujete řešit? ○ >90% aplikacím stačí check přes repository před flushem ○ >90% aplikací nikdy nenaroste natolik, aby to byl skutečný problém ● Pokud to opravdu opravdu potřebujete řešit ○ kdyby/doctrine ... NonLockingUniqueInserter ○ ^ brzy i samostatně, jako kdyby/doctrine-nonlocking-unique-inserter ○ ^ Symfony friendly ❤ ○ ^ sledujte issue kdyby/doctrine#238
  • 9. Vlastní datový typ class UuidType extends Type { const NAME = 'uuid'; function getName() { return self::NAME; } function getSQLDeclaration( array $fieldDeclaration, AbstractPlatform $platform); function convertToPHPValue( $value, AbstractPlatform $platform); function convertToDatabaseValue( $value, AbstractPlatform $platform); Zdroj: ramsey/uuid-doctrine
  • 10. Vlastní datový typ: komentáře ve schématu class SomethingBasedOnStringType extends StringType { function requiresSQLCommentHint( AbstractPlatform $platform) : bool // … $platform->markDoctrineTypeCommented(Type::getType($type));
  • 11. Vlastní datový typ: konverze na úrovni DB class GeometryType extends Type { function canRequireSQLConversion() : bool; function convertToDatabaseValueSQL( $sqlExpr, AbstractPlatform $platform); function convertToPHPValueSQL( $sqlExpr, $platform);
  • 12. Vlastní datový typ: registrace doctrine: dbal: types: uuid: class: RamseyUuidDoctrineUuidType Zdroj: ramsey/uuid-doctrine
  • 13. Vlastní datový typ: použití /** * @ORMId() * @ORMColumn(type="uuid") */ private $id; CREATE TABLE "user" ( id UUID NOT NULL, email VARCHAR(255) DEFAULT NULL -- atd ); COMMENT ON COLUMN "user".id IS '(DC2Type:uuid)';
  • 14. Logika v databázi vs Logika v modelu Premature optimization is the root of all evil ~ Donald Knuth
  • 16. Batch operace s DQL “UPDATE/DELETE statements are ported directly into a Database statement and therefore bypass any locking scheme, events and do not increment the version column. Entities that are already loaded into the persistence context will NOT be synced with the updated database state. It is recommended to call EntityManager#clear() and retrieve new instances of any affected entity.” ~ Dokumentace
  • 17. Batch operace s DQL ● Zkuste nejprve chytřejší způsoby iterace nad výsledkem ○ ORMQuery::iterate(); ○ Stránkování ● Raději DQL update, než SQL update ● Neumí JOINy :(
  • 18. Batch operace s DQL $select = $em->createQueryBuilder() ->addSelect('orderItem.price') ->from(OrderItem::class, 'orderItem') ->andWhere('orderItem.order = theOrder.id'); $update = $em->createQueryBuilder() ->update(Order::class, 'theOrder') ->set('theOrder.totalPrice', sprintf('(%s)', $select)) ->getQuery();
  • 19. Batch operace s DQL UPDATE "order" SET total_price = ( SELECT SUM(o0_.price) AS dctrn__1 FROM order_item o0_ WHERE o0_.order_id = order.id )
  • 20. Batch operace s DBAL ● $connection->prepare('UPDATE ...'); ● $connection->createQueryBuilder();
  • 22. Rozšiřování DQL ● TreeWalker - může modifikovat AST ● output SqlWalker - generuje samotný SQL dotaz ● vlastní funkce
  • 23. Rozšiřování DQL: limitace ● Gramatika je jasně definovaná, není možné to nijak ohackovat ● Tree Walker může modifikovat výsledné AST, ale opět nezmění gramatiku ● SqlWalker to nemá jak zachránit
  • 24. Rozšiřování DQL: co jde Kam nemůže DQL SELECT order.finishedTime IS NULL AS something FROM ...; Tam musí funkce SELECT IS_NULL(order.finishedTime) AS something FROM ...;
  • 25. Rozšiřování DQL: vlastní funkce class IsNull extends FunctionNode { private $expression; public function getSql(SqlWalker $sqlWalker) { return $sqlWalker->walkArithmeticPrimary($this->expression) . ' IS NULL'; } public function parse(Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->expression = $parser->ArithmeticPrimary(); $parser->match(Lexer::T_CLOSE_PARENTHESIS); }
  • 26. SELECT employee, AVG(salary) OVER (PARTITION BY employee.department) AS avgSalary FROM MyEmployee employee; SELECT employee, WINDOW_OVER(AVG(salary), employee.department) AS avgSalary FROM MyEmployee employee; SELECT employee, WINDOW(AVG(salary) OVER (PARTITION BY employee.department)) AS avgSalary FROM MyEmployee employee; Rozšiřování DQL: komplexnější syntaxe
  • 27. Rozšiřování DQL: existující knihovny ● oro/doctrine-extensions (MySQL, PostgreSQL) ● opsway/doctrine-dbal-postgresql (PostgreSQL) ● beberlei/DoctrineExtensions (MySQL, Oracle) ● syslogic/doctrine-json-functions (MySQL) ● další na: https://packagist.org/search/?q=dql
  • 28.
  • 30. Druhy hydratace ● entity ○ ORMQuery::getResult(); ● scalar + entity (mixed results) ○ ORMQuery::getResult(); ● array - vytvoří strukturu jako pro entity a tu vrátí ○ ORMQuery::getArrayResult(); ● scalar - přejmenuje sloupce na fieldy a přetypuje ○ ORMQuery::getScalarResult();
  • 31. Native queries $rsm = new ResultSetMappingBuilder($em); $rsm->addRootEntityFromClassMetadata(OrderItem::class, 'order_item') $connection->createQueryBuilder() ->addSelect($rsm->generateSelectClause()) ->from(...) $em->createNativeQuery($sql, $rsm)
  • 32. Shrnutí: co si z toho odnést? ● Logika v modelu dokud to jenom trochu jde ● Nebát se využívat hojně vlastní typy ● Rozšiřování DQL je snadné ● Doctrine není určená na batch operace Kam dál? ● Youtube kanál “Nette Framework” > search “Doctrine”