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
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
Funciona a la perfección, Gracias Javier. Tendré muy presente la observación de los valores.
@miguelplazasr