ORM.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. namespace Gedmo\Sluggable\Mapping\Event\Adapter;
  3. use Doctrine\ORM\Query;
  4. use Gedmo\Mapping\Event\Adapter\ORM as BaseAdapterORM;
  5. use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
  6. use Gedmo\Tool\Wrapper\AbstractWrapper;
  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, $meta, array $config, $slug)
  23. {
  24. $em = $this->getObjectManager();
  25. $wrapped = AbstractWrapper::wrapp($object, $em);
  26. $qb = $em->createQueryBuilder();
  27. $qb->select('rec.' . $config['slug'])
  28. ->from($config['useObjectClass'], 'rec')
  29. ->where($qb->expr()->like(
  30. 'rec.' . $config['slug'],
  31. $qb->expr()->literal($slug . '%'))
  32. )
  33. ;
  34. // include identifiers
  35. foreach ((array)$wrapped->getIdentifier(false) as $field => $value) {
  36. if (strlen($value) && !$meta->isIdentifier($config['slug'])) {
  37. $qb->andWhere('rec.' . $field . ' <> :' . $field);
  38. $qb->setParameter($field, $value);
  39. }
  40. }
  41. $q = $qb->getQuery();
  42. $q->setHydrationMode(Query::HYDRATE_ARRAY);
  43. return $q->execute();
  44. }
  45. /**
  46. * {@inheritDoc}
  47. */
  48. public function replaceRelative($object, array $config, $target, $replacement)
  49. {
  50. $em = $this->getObjectManager();
  51. $qb = $em->createQueryBuilder();
  52. $qb->update($config['useObjectClass'], 'rec')
  53. ->set('rec.'.$config['slug'], $qb->expr()->concat(
  54. $qb->expr()->literal($replacement),
  55. $qb->expr()->substring('rec.'.$config['slug'], strlen($target))
  56. ))
  57. ->where($qb->expr()->like(
  58. 'rec.'.$config['slug'],
  59. $qb->expr()->literal($target . '%'))
  60. )
  61. ;
  62. // update in memory
  63. $q = $qb->getQuery();
  64. return $q->execute();
  65. }
  66. /**
  67. * {@inheritDoc}
  68. */
  69. public function replaceInverseRelative($object, array $config, $target, $replacement)
  70. {
  71. $em = $this->getObjectManager();
  72. $qb = $em->createQueryBuilder();
  73. $qb->update($config['useObjectClass'], 'rec')
  74. ->set('rec.'.$config['slug'], $qb->expr()->concat(
  75. $qb->expr()->literal($target),
  76. $qb->expr()->substring('rec.'.$config['slug'], strlen($replacement)+1)
  77. ))
  78. ->where('rec.'.$config['mappedBy'].' = :object')
  79. ;
  80. $q = $qb->getQuery();
  81. $q->setParameters(compact('object'));
  82. return $q->execute();
  83. }
  84. }