Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Doctrine PHP, tips & tricks

Doctrine PHP, tips & tricks

Avatar for Inal Djafar

Inal Djafar

October 28, 2015
Tweet

More Decks by Inal Djafar

Other Decks in Programming

Transcript

  1. ORM Un mapping objet-relationnel (ORM) est une technique de programmation

    informatique qui crée l'illusion d'une base de données orientée objet à partir d'une base de données relationnelle en définissant des correspondances entre cette base de données et les objets du langage utilisé.
  2. UN ORM C’EST - Bien(+): - CRUD applications. - Son

    blog personnel. - Moins bien (-) : - Pour les applications complexes avec beaucoup des relations. - Pour faire des traitements en batch. - Pour faire des applications performantes en PHP .
  3. RÉFÉRENCE <?php $locale = $em->getRepository(‘Locale’)—>findById(1); $customer = new Customer(); $customer->setLocale($locale);

    $em->persist($customer); $em->flush(); CAUTION SLIPPERY WHEN WET <?php $locale = $em->getReference(Locale::class, 1); $customer = new Customer(); $customer->setLocale($locale); $em->persist($customer); $em->flush();
  4. IN

  5. IN <?php //Collection $roles = $em->findRoles(); $ids = []; foreach

    ($roles as $role) {
 $ids[] = $role->getId(); } $queryBuilder->where(‘customer.role IN (:ids)’) ->setParameters(‘:ids’, $ids);
  6. IN <?php //Collection $roles = $em->findRoles(); $ids = []; foreach

    ($roles as $role) {
 $ids[] = $role->getId(); } $queryBuilder->where(‘customer.role IN (:ids)’) ->setParameters(‘:ids’, $ids); <?php //Collection $roles = $em->findRoles(); $queryBuilder ->where(‘customer.role IN (:roles)’) ->setParameters(‘:roles’, $roles);
  7. PERSIST & FLUSH <?php function save() { $em->persist(); $em->flush(); }

    foreach ($users as $user) { $this->save($user); }
  8. PERSIST & FLUSH <?php function save() { $em->persist(); $em->flush(); }

    foreach ($users as $user) { $this->save($user); } <?php foreach ($users as $user) { $em->persist($user); } $em->flush();
  9. <?php $product = $em->getRepository()->getProduct(1); $product->setPrice(500); //… $em->persist($product); $em->flush(); PERSIST &

    FLUSH <?php $product = $em->getRepository()->getProduct(1); $product->setPrice(500); //… $em->flush();
  10. CACHE #config_prod.yml doctrine: orm: metadata_cache_driver: apc query_cache_driver: apc result_cache_driver: apc

    <?php $query = $qb->select(‘’)->where(‘’)->getQuery(); $query->useResultCache(true); $query->setResultCacheLifetime(600); return $query->getResult();
  11. HÉRITAGE <?php class RestaurantVip extends Restaurant { //… } $qb->select('r')

    ->from('Model\Restaurant', 'r') ->where('r INSTANCE OF Model\RestaurantVip’)
  12. RELATION ABSTRAITE <?php namespace SharedModule\Model; class Reservation { /** *

    May be Customer, Company or Whatever */ private $owner; }
  13. RELATION ABSTRAITE <?php namespace SharedModule\Model; class Reservation { /** *

    May be Customer, Company or Whatever */ private $owner; } <?php namespace SharedModule\Model; class Reservation { /** * @ManyToOne(targetEntity=“ReservationOwnerIterface”) */ private $owner; }
  14. RELATION ABSTRAITE <?php namespace SharedModule\Model; class Reservation { /** *

    May be Customer, Company or Whatever */ private $owner; } <?php namespace SharedModule\Model; class Reservation { /** * @ManyToOne(targetEntity=“ReservationOwnerIterface”) */ private $owner; } <?php namespace MyApp\Model; class Customer implements ReservationOwnerIterface { }
  15. RELATION ABSTRAITE <?php namespace SharedModule\Model; class Reservation { /** *

    May be Customer, Company or Whatever */ private $owner; } <?php namespace SharedModule\Model; class Reservation { /** * @ManyToOne(targetEntity=“ReservationOwnerIterface”) */ private $owner; } <?php namespace MyApp\Model; class Customer implements ReservationOwnerIterface { } #config.yml doctrine: orm: resolve_target_entities: SharedModule\Model\ReservationOwnerIterface: MyApp\Model\Customer
  16. STRATEGIE DE NOMMAGE <?php /** * @var string $avatarUrl *

    * @ORM\Column(name=“avatar_url”, type=“string”) */ private $avatarUrl;
  17. STRATEGIE DE NOMMAGE <?php /** * @var string $avatarUrl *

    * @ORM\Column(name=“avatar_url”, type=“string”) */ private $avatarUrl; #config.yml doctrine: #... orm: #... naming_strategy: doctrine.orm.naming_strategy.underscore
  18. STRATEGIE DE NOMMAGE <?php /** * @var string $avatarUrl *

    * @ORM\Column(name=“avatar_url”, type=“string”) */ private $avatarUrl; #config.yml doctrine: #... orm: #... naming_strategy: doctrine.orm.naming_strategy.underscore <?php interface NamingStrategy
 { function classToTableName($className); function propertyToColumnName($propertyName);
 function referenceColumnName();
 function joinColumnName($propertyName);
 function joinTableName($source, $target,$propertyName = null);
 function joinKeyColumnName($entityName, $referencedColumnName = null);
 }