ODM.php 3.9 KB

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