Как использовать функции MySQL в Propel - PullRequest
5 голосов
/ 04 ноября 2008

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

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

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

$ c = новые критерии
$ c-> add (FoobarPeer :: CREATED_AT, "DATE_SUB (curdate (), INTERVAL 1 MONTH)", критерии :: GREATER_THAN);

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

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

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

Но я не хочу использовать пользовательские обходные пути, если мне не нужно. Любые советы, кроме использования Criteria :: CUSTOM?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2008

Я думаю, что нет другого выбора, кроме как использовать 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 старается быть независимым от СУБД, чтобы облегчить миграцию путем простого изменения значения конфигурации, поэтому в него не встроены специфические функции СУБД.

1 голос
/ 04 ноября 2008

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

т.е.

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

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

...