ORM.php 3.0 KB

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