Pregunta

Deseo seleccionar registros que tengan 1 mes o más.

La consulta es: SELECT * FROM foobar WHERE created_at > DATE_SUB (curdate (), INTERVAL 1 MONTH)

Usando Propel en Symfony, hago:

  

$ c = nuevos criterios
  $ c- > add (FoobarPeer :: CREATED_AT, " DATE_SUB (curdate (), INTERVAL 1 MONTH) " ;, Criterios :: GREATER_THAN);

Lo que Propel genera es: SELECCIONAR * DESDE foobar DONDE created_at > 'DATE_SUB (curdate (), INTERVAL 1 MONTH)'; en otras palabras, pone la función MySQL entre comillas simples, lo que la convierte en una cadena (sin sentido) y no obtengo registros.

Lo que he hecho por ahora es:

  

$ c- > add (FoobarPeer :: CREATED_AT, " created_at > DATE_SUB (curdate (), INTERVAL 1 MONTH) " ;, Criteria :: CUSTOM);

Pero no quiero usar soluciones personalizadas a menos que tenga que hacerlo. ¿Alguna pista además de usar Criteria :: CUSTOM?

¿Fue útil?

Solución

Creo que no hay otra opción más que usar Criteria :: CUSTOM o hacer una consulta SQL personalizada como esta:

$con = Propel::getConnection(DATABASE_NAME);

$sql = "SELECT foobar.* FROM foobar WHERE created_at > DATE_SUB(curdate(), INTERVAL 1 MONTH)";  
$stmt = $con->prepare($sql);
$stmt->execute();

$books = FoobarPeer::populateObjects($stmt);

Esto se debe a que Propel intenta ser independiente de DBMS, para ayudar a la migración haciendo un simple cambio de valor de configuración, por lo que no tiene ninguna función específica de DBMS incorporada.

Otros consejos

simplemente reemplace el código de fecha mysql que está usando allí con una variable php precalculada que ya tiene esa fecha.

es decir

$monthAgo = '2008-10-03';
$c = new Criteria
$c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN); 

obviamente, debe calcular dinámicamente la fecha en php, en lugar de codificarla, pero obtiene la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top