Domanda

Voglio selezionare i record di 1 mese o più recenti.

La query è: SELEZIONA * DA foobar DOVE creato_at > DATE_SUB (curdate (), INTERVAL 1 MONTH)

Usando Propel in Symfony, lo faccio:

  

$ c = nuovi criteri
  $ c- > add (FoobarPeer :: CREATED_AT, " DATE_SUB (curdate (), INTERVAL 1 MONTH) " ;, Criteri :: GREATER_THAN);

Ciò che Propel genera è: SELEZIONA * DA foobar DOVE creato_at > 'DATE_SUB (curdate (), INTERVAL 1 MONTH)' - in altre parole, mette la funzione MySQL tra virgolette singole, il che la rende una stringa (senza significato) e non ottengo alcun record.

Quello che ho fatto per ora è:

  

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

Ma non voglio usare soluzioni alternative personalizzate a meno che non sia necessario. Qualche suggerimento oltre all'utilizzo di Criteria :: PERSONALIZZATO?

È stato utile?

Soluzione

Penso che non ci sia altra opzione che usare Criteria :: CUSTOM o fare una query SQL personalizzata come questa:

$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);

Questo perché Propel cerca di essere indipendente da DBMS, per aiutare la migrazione facendo una semplice modifica del valore di configurazione, quindi non ha nessuna funzione specifica per DBMS integrata.

Altri suggerimenti

sostituisci semplicemente il codice data mysql che stai utilizzando lì con una variabile php precalcolata che contiene già quella data.

cioè.

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

ovviamente, dovresti calcolare dinamicamente la data in php, piuttosto che codificarla duramente, ma ottieni l'immagine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top