Я хочу выбрать записи размером 1 месяц или более.
Запрос: SELECT * FROM foobar WHERE created_at> DATE_SUB (curdate (), INTERVAL 1 MONTH)
Используя Propel в Symfony, я делаю:
$ c = новые критерии
$ c-> add (FoobarPeer :: CREATED_AT, "DATE_SUB (curdate (), INTERVAL 1 MONTH)", Criteria :: GREATER_THAN);
Что генерирует Propel: SELECT * FROM foobar WHERE created_at> 'DATE_SUB (curdate (), INTERVAL 1 MONTH)' – другими словами, он ставит функцию MySQL в одинарные кавычки, что делает ее (бессмысленной), и я не получаю записей.
То, что я сделал сейчас:
$ c-> add (FoobarPeer :: CREATED_AT, "created_at> DATE_SUB (curdate (), INTERVAL 1 MONTH)", Criteria :: CUSTOM);
Но я не хочу использовать пользовательские обходные пути, если только это не нужно. Любые подсказки, кроме использования Criteria :: CUSTOM?
Я думаю, что нет другого варианта, кроме использования Criteria :: CUSTOM или выполнения пользовательского SQL-запроса, например:
$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);
Это потому, что Propel пытается быть агрегированным DBMS, чтобы помочь миграции, выполнив простое изменение значения конфигурации, поэтому он не имеет встроенных встроенных функций СУБД.
просто замените код даты mysql, который вы используете там, с предварительно рассчитанной переменной php, которая уже имеет эту дату.
т.е.
$monthAgo = '2008-10-03'; $c = new Criteria $c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN);
очевидно, вам следует динамически вычислять дату в php, а не жестко кодировать ее, но вы получаете картину.