2010-03-11 9 views
6

Me estoy mojando los pies en DBIx::Class — que le encanta hasta ahora.¿Cómo puedo filtrar un conjunto de registros Perl DBIx con 2 condiciones en la misma columna?

Un problema con el que me estoy encontrando es que quiero consultar registros, filtrar los registros que no están en un cierto rango de fechas.

Me tomó un tiempo para encontrar la manera de hacer un tipo de partido en lugar de un partido de la igualdad <=:

my $start_criteria = ">= $start_date"; 
my $end_criteria = "<= $end_date"; 
my $result = $schema->resultset('MyTable')->search(
    { 
    'status_date' => \$start_criteria, 
    'status_date' => \$end_criteria, 
    }); 

El problema obvio con esto es que, dado que los filtros están en un hash, soy sobrescribiendo el valor para "fecha_de_stado", y solo estoy buscando donde la fecha_de_stado < = $ end_date. El SQL que se ejecuta es:

SELECT me.* from MyTable me where status_date <= '9999-12-31' 

He buscado CPAN, Google y SO y no han sido capaces de encontrar la manera de aplicar 2 condiciones a la misma columna. Toda la documentación que he podido encontrar muestra cómo filtrar más de 1 columna, pero no 2 condiciones en la misma columna.

Estoy seguro de que me falta algo obvio. ¿Puede alguien aquí señalarlo a mí?

Respuesta

5

IIRC, que debe ser capaz de pasar una referencia de matriz de varias condiciones de búsqueda Por ejemplo (cada uno en su propia hashref.):

my $result = $schema->resultset('MyTable')->search(
    [ { 'status_date' => \$start_criteria }, 
    { 'status_date' => \$end_criteria }, 
    ] 
); 

Editar: Vaya, nervermind. Eso hace un quirófano, a diferencia de un AND.

Parece que la forma correcta de hacerlo es suministrar un hashref para un solo status_date:

my $result = $schema->resultset('MyTable')->search(
    { status_date => { '>=' => $start_date, '<=' => $end_date } } 
); 

Este material se documenta en SQL::Abstract, que utiliza DBIC bajo el capó.

+0

perfecto! ¡Eso es exactamente lo que necesitaba! Si solo eso se documentó mejor ... Muchas gracias, friedo, lo aprecio! – BrianH

1

Hay BETWEEN en SQL y en DBIx :: Clase es apoyado:

my $result = $schema->resultset('MyTable') 
    ->search({status_date => {between => [$start_date,$end_date]}}); 
Cuestiones relacionadas