Вопрос

Я хочу выбрать записи возрастом 1 месяц или новее.

Запрос:ВЫБЕРИТЕ * ИЗ foobar ГДЕ создано_at > DATE_SUB(curdate(), ИНТЕРВАЛ 1 МЕСЯЦ)

Используя Propel в Symfony, я делаю:

$c = новые критерии
$c->add(FoobarPeer::CREATED_AT, "DATE_SUB(curdate(), ИНТЕРВАЛ 1 МЕСЯЦ)", Criteria::GREATER_THAN);

Propel генерирует:SELECT * FROM foobar WHERE create_at > 'DATE_SUB(curdate(), INTERVAL 1 MONTH)' - другими словами, он помещает функцию MySQL в одинарные кавычки, что делает ее (бессмысленной) строкой, и я не получаю никаких записей.

На данный момент я сделал следующее:

$c->add(FoobarPeer::CREATED_AT, "create_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 пытается быть независимым от СУБД, чтобы помочь миграции, выполняя простое изменение значения конфигурации, поэтому он не имеет встроенных функций, специфичных для СУБД.

Другие советы

просто замените код даты mysql, который вы там используете, предварительно рассчитанной переменной php, в которой уже есть эта дата.

то есть

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

очевидно, вам следует динамически рассчитывать дату в php, а не жестко ее кодировать, но вы поняли.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top