ODM.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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('/^' . str_replace('/', '\/', $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. ->where("function() {
  52. return this.{$config['slug']}.indexOf('{$target}') === 0;
  53. }")
  54. ->getQuery()
  55. ;
  56. $q->setHydrate(false);
  57. $result = $q->execute();
  58. if ($result instanceof Cursor) {
  59. $result = $result->toArray();
  60. foreach ($result as $targetObject) {
  61. $slug = preg_replace("@^{$target}@smi", $replacement.$config['pathSeparator'], $targetObject[$config['slug']]);
  62. $dm
  63. ->createQueryBuilder()
  64. ->update($config['useObjectClass'])
  65. ->field($config['slug'])->set($slug)
  66. ->field($meta->identifier)->equals($targetObject['_id'])
  67. ->getQuery()
  68. ->execute()
  69. ;
  70. }
  71. }
  72. }
  73. /**
  74. * This query can couse some data integrity failures since it does not
  75. * execute atomicaly
  76. *
  77. * {@inheritDoc}
  78. */
  79. public function replaceInverseRelative($object, array $config, $target, $replacement)
  80. {
  81. $dm = $this->getObjectManager();
  82. $wrapped = AbstractWrapper::wrapp($object, $dm);
  83. $meta = $dm->getClassMetadata($config['useObjectClass']);
  84. $q = $dm
  85. ->createQueryBuilder($config['useObjectClass'])
  86. ->field($config['mappedBy'].'.'.$meta->identifier)->equals($wrapped->getIdentifier())
  87. ->getQuery()
  88. ;
  89. $q->setHydrate(false);
  90. $result = $q->execute();
  91. if ($result instanceof Cursor) {
  92. $result = $result->toArray();
  93. foreach ($result as $targetObject) {
  94. $slug = preg_replace("@^{$replacement}@smi", $target, $targetObject[$config['slug']]);
  95. $dm
  96. ->createQueryBuilder()
  97. ->update($config['useObjectClass'])
  98. ->field($config['slug'])->set($slug)
  99. ->field($meta->identifier)->equals($targetObject['_id'])
  100. ->getQuery()
  101. ->execute()
  102. ;
  103. }
  104. }
  105. }
  106. }