2008-11-03 15 views
5

Ich möchte Datensätze auswählen, die 1 Monat alt oder neuer sind.So verwenden Sie MySQL-Funktionen in Propel

Die Abfrage wird: SELECT * FROM foobar WHERE created_at> DATE_SUB (CURDATE(), interval 1 Monat)

Mit Propel in Symfony, ich mache:

$ c = new Criteria
$ c-> hinzufügen (FoobarPeer :: CREATED_AT, "DATE_SUB (curdate(), INTERVALL 1 Monat)", Kriterien :: GREATER_THAN);

Was Propel erzeugt ist: SELECT * FROM foobar WHERE created_at> 'DATE_SUB (CURDATE(), interval 1 Monat)' - mit anderen Worten, es die MySQL-Funktion in einfache Anführungszeichen setzt, die es macht ein (sinnlos) string und ich bekomme keine Aufzeichnungen.

Was ich jetzt getan ist:

$ c-> add (FoobarPeer :: CREATED_AT "created_at> DATE_SUB (CURDATE(), interval 1 Monat)", Kriterien :: CUSTOM) ;

Aber ich möchte keine benutzerdefinierten Problemumgehungen verwenden, es sei denn, ich muss. Irgendwelche Hinweise neben der Verwendung von Kriterien :: CUSTOM?

+0

Da sich Propel stark entwickelt hat, seit diese Frage beantwortet wurde, hier einige Überlegungen (geschrieben vom Propel-Projektleiter), in denen angegeben wird, ob ORM oder Raw SQL relevant ist: http: //propelposterous. com/how-can-ich-write-this-query-using-ein-orm –

Antwort

2

Ich denke, es gibt keine Option mehr als die Verwendung von Kriterien :: CUSTOM oder eine benutzerdefinierte SQL-Abfrage wie folgt vorgehen:

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

Das ist, weil Propel versucht DBMS-agnostisch zu sein, zu helfen, die Migration durch eine einfache tun Konfigurationswert ändern, so dass es keine DBMS-spezifischen Funktionen eingebaut hat.

1

Ersetzen Sie einfach den MySQL-Datumscode, den Sie dort verwenden, mit einer vorberechneten PHP-Variable, die dieses Datum bereits enthält.

heißt

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

offensichtlich, sollten Sie dynamisch das Datum in PHP berechnen, anstatt hart es Codierung, aber Sie erhalten das Bild.

+0

Ja könnte ich, aber ich würde lieber mysql-Funktionen verwenden - PHP hat eine schwache Unterstützung für die Datumsarithmetik. –