Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Buscar dentro de un campo array

15 de mayo de 2015

Hola, tengo una entidad que tiene una columna de tipo array,

/**
 * @var array
 * @ORM\Column(type="array")
 * @Assert\NotBlank()
 */
protected $customerType;

En este campo almaceno varias opciones, y lo configuro como un tipo choice en el formulario:

->add('customerType', 'choice', array(
    'choices' => array(
        'tipo1' => 'tipo1',
        'tipo2' => 'tipo2',
        'tipo3' => 'tipo3',
        'tipo4' => 'tipo4',
    ),
))

En la base de datos, estas opciones quedan almacenadas así:

a:4:{i:0;s:5:"tipo1";i:1;s:5:"tipo2";i:2;s:5:"tipo3";i:3;s:5:"tipo4";}

Mi pregunta es, ¿cómo recupero los registros que sean de cierto tipo? Estoy intentando la siguiente consulta pero no me resulta:

$er->createQueryBuilder('c')
   ->where('c.customerType IN (:target) ')
   ->setParameter('tipo1');

Agradezco mucho la ayuda que me puedan brindar.


Respuestas

#1

En mi opinión, las propiedades de tipo array de Doctrine son un poco tramposas precisamente por lo que explicas en tu pregunta. Funcionan muy bien para serializar/deserializar el array automáticamente y es muy cómodo editar sus valores en un formulario de Symfony. Pero cuando tienes que buscar registros que incluyan un valor como parte del array, no es nada fácil conseguirlo.

Yo lo que suelo hacer es una búsqueda textual de la siguiente manera:

$er->createQueryBuilder('c')
   ->where('c.customerType LIKE :target')
   ->setParameter('target', '%'.$tipo.'%');

El gran problema es que no puedes usarlo cuando un valor contiene a otro. Por ejemplo, si los valores admin y super_admin se permiten, al buscar admin te devolvería también los registros que sólo tienen super_admin.

@javiereguiluz

15 mayo 2015, 9:55
#2

Funciona a la perfección, Gracias Javier. Tendré muy presente la observación de los valores.

@miguelplazasr

15 mayo 2015, 18:26