ODM.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace Gedmo\Sluggable\Mapping\Event\Adapter;
  3. use Gedmo\Mapping\Event\Adapter\ODM as BaseAdapterODM;
  4. use Doctrine\ODM\MongoDB\Cursor;
  5. use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
  6. use Gedmo\Tool\Wrapper\AbstractWrapper;
  7. /**
  8. * Doctrine event adapter for ODM adapted
  9. * for sluggable behavior
  10. *
  11. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  12. * @package Gedmo\Sluggable\Mapping\Event\Adapter
  13. * @subpackage ODM
  14. * @link http://www.gediminasm.org
  15. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  16. */
  17. final class ODM extends BaseAdapterODM implements SluggableAdapter
  18. {
  19. /**
  20. * {@inheritDoc}
  21. */
  22. public function getSimilarSlugs($object, $meta, array $config, $slug)
  23. {
  24. $dm = $this->getObjectManager();
  25. $qb = $dm->createQueryBuilder($config['useObjectClass']);
  26. $identifier = $this->extractIdentifier($dm, $object);
  27. if ($identifier && !$meta->isIdentifier($config['slug'])) {
  28. $qb->field($meta->identifier)->notEqual($identifier);
  29. }
  30. $qb->field($config['slug'])->equals(new \MongoRegex('/^' . preg_quote($slug, '/') . '/'));
  31. $q = $qb->getQuery();
  32. $q->setHydrate(false);
  33. $result = $q->execute();
  34. if ($result instanceof Cursor) {
  35. $result = $result->toArray();
  36. }
  37. return $result;
  38. }
  39. /**
  40. * This query can couse some data integrity failures since it does not
  41. * execute atomicaly
  42. *
  43. * {@inheritDoc}
  44. */
  45. public function replaceRelative($object, array $config, $target, $replacement)
  46. {
  47. $dm = $this->getObjectManager();
  48. $meta = $dm->getClassMetadata($config['useObjectClass']);
  49. $q = $dm
  50. ->createQueryBuilder($config['useObjectClass'])
  51. ->field($config['slug'])->equals(new \MongoRegex('/^' . preg_quote($target, '/') . '/'))
  52. ->getQuery()
  53. ;
  54. $q->setHydrate(false);
  55. $result = $q->execute();
  56. if ($result instanceof Cursor) {
  57. $result = $result->toArray();
  58. foreach ($result as $targetObject) {
  59. $slug = preg_replace("@^{$target}@smi", $replacement.$config['pathSeparator'], $targetObject[$config['slug']]);
  60. $dm
  61. ->createQueryBuilder()
  62. ->update($config['useObjectClass'])
  63. ->field($config['slug'])->set($slug)
  64. ->field($meta->identifier)->equals($targetObject['_id'])
  65. ->getQuery()
  66. ->execute()
  67. ;
  68. }
  69. }
  70. }
  71. /**
  72. * This query can couse some data integrity failures since it does not
  73. * execute atomicaly
  74. *
  75. * {@inheritDoc}
  76. */
  77. public function replaceInverseRelative($object, array $config, $target, $replacement)
  78. {
  79. $dm = $this->getObjectManager();
  80. $wrapped = AbstractWrapper::wrapp($object, $dm);
  81. $meta = $dm->getClassMetadata($config['useObjectClass']);
  82. $q = $dm
  83. ->createQueryBuilder($config['useObjectClass'])
  84. ->field($config['mappedBy'].'.'.$meta->identifier)->equals($wrapped->getIdentifier())
  85. ->getQuery()
  86. ;
  87. $q->setHydrate(false);
  88. $result = $q->execute();
  89. if ($result instanceof Cursor) {
  90. $result = $result->toArray();
  91. foreach ($result as $targetObject) {
  92. $slug = preg_replace("@^{$replacement}@smi", $target, $targetObject[$config['slug']]);
  93. $dm
  94. ->createQueryBuilder()
  95. ->update($config['useObjectClass'])
  96. ->field($config['slug'])->set($slug)
  97. ->field($meta->identifier)->equals($targetObject['_id'])
  98. ->getQuery()
  99. ->execute()
  100. ;
  101. }
  102. }
  103. }
  104. }