* @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, ClassMetadata $meta, array $config, $slug) { $em = $this->getObjectManager(); $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 $entityIdentifiers = $this->extractIdentifier($em, $object, false); $parameters = array(); foreach ((array)$entityIdentifiers as $field => $value) { if (strlen($value)) { $qb->andWhere('rec.' . $field . ' <> :' . $field); $parameters[$field] = $value; } } $q = $qb->getQuery(); if ($parameters) { $q->setParameters($parameters); } $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(); } }