2011-07-04 21 views
11

Según el título, ¿cómo coincidiría en una expresión regular con el generador de consultas de Doctrine 2? Básicamente, estoy tratando de generar babosas únicas.Generador de consultas Regex con Doctrine 2?

Aquí está mi implementación actual. Yo genero la babosa. Luego verifico si hay babosas en uso como esta babosa. Si los hay, agregaré un - {number} al final de la babosa, donde {number} es el número más bajo que aún no está en uso.

$qb->select(array('partial o.{id, slug}')) 
    ->from('Foo\Bar\Entity\Object', 'o') 
    ->where($qb->expr()->like('o.slug', ':slug')); 

$slug = new SlugNormalizer($text); 
$qb->setParameter('slug', $slug->__toString().'-%'); 

El problema aquí es babosa LIKE% podía igualar foo-bar-1, foo-bar-2, Y foo-bar-no-la-misma-babosa. Lo que sería más limpio es una expresión regular que busca REGEX slug - (\ d +) o algo similar.

¿Alguna manera de hacer esto con el generador de consultas de Doctrine 2?

Respuesta

-2

No se ha probado (por MySQL):

$qb->where(new Doctrine\ORM\Query\Expr\Comparison(
    'o.slug', 'REGEXP', ':slug') 
); 
$qb->setParameter('slug', '^'.$slug->__toString().'-[[:digit:]]+$'); 
+0

Esto no funciona. La clase Doctrine \ ORM \ Query \ Expr \ Comparison solo tiene los siguientes operadores: const EQ = '='; const NEQ = '<>'; const LT = '<'; const LTE = '<='; const GT = '>'; const GTE = '> ='; ¡NO HAY NINGUNA OPCIÓN DE REGEXP! Además, no es una operación de comparación ... ¿por qué viviría allí en el 1er lugar? –

+0

Tienes razón, no funciona. Pero es una operación de comparación. Dos operandos, un operador entre ellos, para mí es una comparación. – Maxence

+0

Ah, cuando lo dices así, tal vez tengas razón. Podría ser una operación de comparación ... independientemente, je, no funciona. = [ –

3

REGEXP es una función específica de proveedor de modo doctrina misma no es compatible con ella. Además, no es tanto una función como un operador de comparación (see this answer). Pero puede usar la función en el campo para comparar con otro valor. DoctrineExtensions (escrito por un colaborador de doctrina) tiene un código para habilitar la expresión regular en MySQL.

Ejemplo del archivo:

$query = $this->getEntityManager()->createQuery('SELECT A FROM Entity A WHERE REGEXP(A.stringField, :regexp) = 1'); 
$query->setParameter('regexp', '^[ABC]'); 
$results = $query->getArrayResult(); 

Si no desea utilizar DoctrineExtensions, usted puede escribir su propia siguiendo this blog post, o puede look at the code for this Doctrine extension y escribir su propia función DQL personalizado.

He confirmado que REGEXP utilizando DoctrineExtensions ¡funciona muy bien para mis necesidades!

16

añadir el DoctrineExtensionsBundle - Actualiza tu composer.json:

"beberlei/DoctrineExtensions": "0.3.x-dev", 

añadir la configuración REGEXP - Actualiza la aplicación/config.yml

doctrine: 
    orm: 
     dql: 
      string_functions: 
       regexp: DoctrineExtensions\Query\Mysql\Regexp 

donde quiera que su QueryBuilder es hacer esto:

$qb = $this->createQueryBuilder('x'); 

return $qb->andWhere('REGEXP(x.your_property, :regexp) = true') 
      ->setParameter('regexp', '[[:digit:]]{3}') // insert your own regex here 
      ->getQuery()->getResult(); 

y no olvides usar las expresiones regulares compatibles con SQL

+1

Sería bueno señalar una referencia. https: // github.com/beberlei/DoctrineExtensions – thexpand

+0

Esto también funciona cuando se unen tablas – dustfeather

0

me ha gustado esta

$query->andWhere('REGEXP(r.status, :text) = 1') 
     ->orWhere('REGEXP(r.comment, :text) = 1') 
     ->setParameter('text',MY REGULAR EXP);