ORM.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. namespace Gedmo\Sluggable\Mapping\Event\Adapter;
  3. use Gedmo\Mapping\Event\Adapter\ORM as BaseAdapterORM;
  4. use Doctrine\Common\Persistence\Mapping\ClassMetadata;
  5. use Doctrine\ORM\Query;
  6. use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
  7. /**
  8. * Doctrine event adapter for ORM adapted
  9. * for sluggable behavior
  10. *
  11. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  12. * @package Gedmo\Sluggable\Mapping\Event\Adapter
  13. * @subpackage ORM
  14. * @link http://www.gediminasm.org
  15. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  16. */
  17. final class ORM extends BaseAdapterORM implements SluggableAdapter
  18. {
  19. /**
  20. * {@inheritDoc}
  21. */
  22. public function getSimilarSlugs($object, ClassMetadata $meta, array $config, $slug)
  23. {
  24. $em = $this->getObjectManager();
  25. $qb = $em->createQueryBuilder();
  26. $qb->select('rec.' . $config['slug'])
  27. ->from($config['useObjectClass'], 'rec')
  28. ->where($qb->expr()->like(
  29. 'rec.' . $config['slug'],
  30. $qb->expr()->literal($slug . '%'))
  31. );
  32. // include identifiers
  33. $entityIdentifiers = $this->extractIdentifier($em, $object, false);
  34. $parameters = array();
  35. foreach ((array)$entityIdentifiers as $field => $value) {
  36. if (strlen($value)) {
  37. $qb->andWhere('rec.' . $field . ' <> :' . $field);
  38. $parameters[$field] = $value;
  39. }
  40. }
  41. $q = $qb->getQuery();
  42. if ($parameters) {
  43. $q->setParameters($parameters);
  44. }
  45. $q->setHydrationMode(Query::HYDRATE_ARRAY);
  46. return $q->execute();
  47. }
  48. /**
  49. * {@inheritDoc}
  50. */
  51. public function replaceRelative($object, array $config, $target, $replacement)
  52. {
  53. $em = $this->getObjectManager();
  54. $qb = $em->createQueryBuilder();
  55. $qb->update($config['useObjectClass'], 'rec')
  56. ->set('rec.'.$config['slug'], $qb->expr()->concat(
  57. $qb->expr()->literal($replacement),
  58. $qb->expr()->substring('rec.'.$config['slug'], strlen($target))
  59. ))
  60. ->where($qb->expr()->like(
  61. 'rec.'.$config['slug'],
  62. $qb->expr()->literal($target . '%'))
  63. )
  64. ;
  65. // update in memory
  66. $q = $qb->getQuery();
  67. return $q->execute();
  68. }
  69. /**
  70. * {@inheritDoc}
  71. */
  72. public function replaceInverseRelative($object, array $config, $target, $replacement)
  73. {
  74. $em = $this->getObjectManager();
  75. $qb = $em->createQueryBuilder();
  76. $qb->update($config['useObjectClass'], 'rec')
  77. ->set('rec.'.$config['slug'], $qb->expr()->concat(
  78. $qb->expr()->literal($replacement),
  79. $qb->expr()->substring('rec.'.$config['slug'], strlen($target)+1)
  80. ))
  81. ->where('rec.'.$config['mappedBy'].' = :object')
  82. ->andWhere($qb->expr()->like(
  83. 'rec.'.$config['slug'],
  84. $qb->expr()->literal($target . '%'))
  85. )
  86. ;
  87. $q = $qb->getQuery();
  88. $q->setParameters(compact('object'));
  89. return $q->execute();
  90. }
  91. }