1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- <?php
- namespace Gedmo\Sluggable\Mapping\Event\Adapter;
- use Doctrine\ORM\Query;
- use Gedmo\Mapping\Event\Adapter\ORM as BaseAdapterORM;
- use Gedmo\Sluggable\Mapping\Event\SluggableAdapter;
- use Gedmo\Tool\Wrapper\AbstractWrapper;
- /**
- * Doctrine event adapter for ORM adapted
- * for sluggable behavior
- *
- * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
- * @package Gedmo\Sluggable\Mapping\Event\Adapter
- * @subpackage ORM
- * @link http://www.gediminasm.org
- * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
- */
- final class ORM extends BaseAdapterORM implements SluggableAdapter
- {
- /**
- * {@inheritDoc}
- */
- public function getSimilarSlugs($object, $meta, array $config, $slug)
- {
- $em = $this->getObjectManager();
- $wrapped = AbstractWrapper::wrapp($object, $em);
- $qb = $em->createQueryBuilder();
- $qb->select('rec.' . $config['slug'])
- ->from($config['useObjectClass'], 'rec')
- ->where($qb->expr()->like(
- 'rec.' . $config['slug'],
- $qb->expr()->literal($slug . '%'))
- )
- ;
- // include identifiers
- foreach ((array)$wrapped->getIdentifier(false) as $field => $value) {
- if (strlen($value) && !$meta->isIdentifier($config['slug'])) {
- $qb->andWhere('rec.' . $field . ' <> :' . $field);
- $qb->setParameter($field, $value);
- }
- }
- $q = $qb->getQuery();
- $q->setHydrationMode(Query::HYDRATE_ARRAY);
- return $q->execute();
- }
- /**
- * {@inheritDoc}
- */
- public function replaceRelative($object, array $config, $target, $replacement)
- {
- $em = $this->getObjectManager();
- $qb = $em->createQueryBuilder();
- $qb->update($config['useObjectClass'], 'rec')
- ->set('rec.'.$config['slug'], $qb->expr()->concat(
- $qb->expr()->literal($replacement),
- $qb->expr()->substring('rec.'.$config['slug'], strlen($target))
- ))
- ->where($qb->expr()->like(
- 'rec.'.$config['slug'],
- $qb->expr()->literal($target . '%'))
- )
- ;
- // update in memory
- $q = $qb->getQuery();
- return $q->execute();
- }
- /**
- * {@inheritDoc}
- */
- public function replaceInverseRelative($object, array $config, $target, $replacement)
- {
- $em = $this->getObjectManager();
- $qb = $em->createQueryBuilder();
- $qb->update($config['useObjectClass'], 'rec')
- ->set('rec.'.$config['slug'], $qb->expr()->concat(
- $qb->expr()->literal($target),
- $qb->expr()->substring('rec.'.$config['slug'], strlen($replacement)+1)
- ))
- ->where('rec.'.$config['mappedBy'].' = :object')
- ;
- $q = $qb->getQuery();
- $q->setParameters(compact('object'));
- return $q->execute();
- }
- }
|