2010-04-20 17 views
5

Estoy tratando de obtener todos los registros con fecha mayor que ahora. Intenté esto pero no funciona:cakephp: cómo hacer que NOW() funcione en condiciones de búsqueda?

$all_dates = $this->TourDate->find('all', array('conditions' => array('TourDate.date >=' => 'NOW()'), 'order' => array('TourDate.date ASC'))); 

Si reemplazo NOW() con la fecha actual, funciona. ¿Porque eso?

Respuesta

24

No consumo CakePHP pero estoy bastante seguro de que su 'NOW()' está analizando a cuerda y finalmente ha obtenido como resultado

TourDate.date >= 'NOW()' 

Tal vez usted sólo debe tratar

array('TourDate.date >= NOW()') 

como un valor sólo en lugar de dividirlo en key => value style?

+0

sí que lo hizo. No sabía que era posible no usar el estilo key => value. Gracias – kaklon

+3

Sugerencia: si alguna respuesta es una solución, márquela haciendo clic en el contorno de la casilla de verificación a la izquierda de la respuesta. – hsz

+0

(+1) Buena respuesta. Me ayuda. Gracias. – Chinmay235

0

hsz es correcto. Cake interpreta la condición NOW() como la cadena 'NOW()'. Proporcionar un fragmento SQL completo en sus condiciones funcionará, como lo sugiere hsz.

Puede que tenga la tentación de usar date('Y-m-d H:i:s') en lugar de NOW() (como sugerí en la primera versión de esta respuesta). ¡No lo hagas! Como señala hsz a continuación, esto evitará que la consulta se guarde en caché.

+1

Si utiliza 'fecha()' las consultas no se almacenarán en caché. – hsz

-1

Creo que CakePHP elimina cualquier función similar a SQL para evitar un ataque de inyección SQL. Aunque me molesta, usualmente uso el truco de la fecha ('Y-m-d H: i: s') también.

+1

No, no lo hace por razones de seguridad. Cake solo toma el valor dentro de la matriz asociativa y lo arroja a cadenas literales para MySQL. La solución anterior (poner la función NOW() en la clave, no el valor) funciona. Todavía es extraño que hayas votado negativamente por simplemente ser incorrecto. –

1

'conditions' => array('TourDate.date >= NOW()')

De lo contrario, CakePHP citar la función NOW(), y MySQL va a pensar en ello como una cadena.

3

Si está buscando una forma de hacerlo con PHP-función en lugar de funciones de MySQL no tiene que usar el formato sin formato $conditions = array('begin >' => date('Y-m-d H:i:s')), MySQL entiende el preajuste 'c' más corto de PHPs date() para ISO 8601 fechas con $conditions = array('begin >' => date('c')).

Me gusta esto para hacer consultas como 'begin >' => date('c', strtotime("+4 weeks")), que es un código muy legible y excelente para depurar cuando miras las consultas SQL.

Cuestiones relacionadas