2008-11-03 17 views
5

Chcę wybrać rekordy, które mają 1 miesiąc lub są nowsze.Jak korzystać z funkcji MySQL w Propel

Zapytanie jest: SELECT * FROM foobar GDZIE created_at> DATE_SUB (CURDATE(), INTERVAL 1 miesiąc)

Korzystanie Propel w Symfony, zrobić:

$ c = nowe kryteria
$ c-> add (FoobarPeer :: CREATED_AT, "DATE_SUB (curdate(), INTERVAL 1 MONTH)", Kryteria :: GREATER_THAN);

Co generuje Propel jest: SELECT * FROM foobar GDZIE created_at> 'DATE_SUB (CURDATE(), INTERVAL 1 miesiąc)' - innymi słowy, to stawia funkcji MySQL w apostrofach, co sprawia, że ​​jest on (bez znaczenia) ciąg i nie otrzymuję żadnych rekordów.

Co robiłem na razie jest:

$ c-> add (FoobarPeer :: created_at "created_at> DATE_SUB (CURDATE(), INTERVAL 1 miesiąc)" Kryteria :: CUSTOM) ;

Ale nie chcę używać niestandardowych obejść, chyba że muszę. Wszelkie wskazówki oprócz użycia Kryteriów :: CUSTOM?

+0

Ponieważ Propel bardzo się rozwinął od czasu udzielenia odpowiedzi na to pytanie, oto kilka uwag (napisanych przez lidera projektu Propel), informujących, kiedy istotne jest użycie ORM, lub surowego SQL: http: //propel.posterous. com/how-can-i-write-this-query-using-an-orm –

Odpowiedz

2

myślę, że nie ma opcji więcej niż przy użyciu Criteria :: CUSTOM lub wykonując zapytanie zwyczaj SQL takiego:

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

To dlatego, że Propel stara się być DBMS-agnostyk, aby pomóc migracji wykonując proste zmiana wartości konfiguracji, więc nie ma żadnych wbudowanych specyficznych funkcji DBMS.

1

wystarczy zastąpić kod daty mysql, którego używasz, z wstępnie obliczoną zmienną php, która już zawiera tę datę.

tj

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

oczywiście należy dynamicznie obliczyć datę w php, zamiast ciężko go kodowania, ale pojawi się obraz.

+0

Tak, mogłem, ale wolałbym używać funkcji mysql - php ma słabą obsługę arytmetyki dat. –