2010-05-04 3 views
2

Использование Propel Я бы хотел найти записи, у которых есть поле даты, которое не является нулевым, а также между определенным диапазоном.Выбор диапазона дат, когда дата не равна нулю Propel

N.B. К сожалению, поскольку это часть большого запроса, я не могу использовать специальный SQL-запрос здесь.

Например: я, возможно, записи, как это:

--------------------- 
| ID | DUE_DATE  | 
--------------------- 
| 1 | NULL  | 
| 2 | 01/01/2010 | 
| 3 | 02/01/2010 | 
| 4 | NULL  | 
| 5 | 05/01/2010 | 
--------------------- 

я могу хотеть, чтобы вернуть все строки с DUE_DATE между 01.01.2010 и 02/01/2010, но я не» t хочет вернуть те записи, где due_date имеет значение NULL.

В примере я только хочу, чтобы возвращать строки 2 и 3.

Однако Propel кажется перезаписать свои критерии NotNull.

Можно ли это сделать с помощью Propel?

Спасибо!

ответ

4

Почему вы создаете отдельные Criterion объекты?

$start_date = mktime(0, 0, 0, date("m") , date("d")+$start, date("Y")); 
$end_date = mktime(0, 0, 0, date("m") , date("d")+$end, date("Y")); 

$c = new Criteria(); 
$c->add(TaskPeer::DUE_DATE, $end_date, Criteria::LESS_EQUAL); 
$c->addAnd(TaskPeer::DUE_DATE, $start_date, Criteria::GREATER_EQUAL); 
$c->addAnd(TaskPeer::DUE_DATE, null, Criteria::ISNOTNULL); 

Когда я пытаюсь это в Propel 1.2, 1.3 или 1.4, я получаю следующее SQL заявление:

SELECT task.TASK_ID, task.DUE_DATE FROM task WHERE ((task.DUE_DATE<=:p1 AND task.DUE_DATE>=:p2) AND task.DUE_DATE IS NOT NULL)

$c->add()метод заменяет текущий критерий для данной области. Вы создаете свои критерии для TaskPeer::DUE_DATE, поэтому они всегда будут заменять предыдущие.

+0

Хорошо - мне, наверное, просто нужно перейти на Propel 1.4, не так ли! Спасибо за Ваш ответ. –

+0

Я перепробовал это в Propel 1.2 и 1.3, и получаю те же результаты. Поэтому, пока вы можете обновить (возможно, сейчас выбрать 1.5, он стабилен и намного приятнее для построения запросов), вам это не нужно. –

+0

Фантастический. Спасибо, что вернулись и проверили это для меня. У меня не будет возможности снова рассмотреть этот вопрос до сегодняшнего вечера. –

2

Я не получил удалить нулевые записи раздел, я думаю, что он будет производить: tasks.due_date IS NULL AND tasks.due_date IS NULL.

В любом случае, возможно, вы можете использовать Criteria::CUSTOM для написания предложения WHERE-SQL-предложения? Пример из Propel documentation:

$con = Propel::getConnection(ReviewPeer::DATABASE_NAME); 

$c = new Criteria(); 
$c->add(ReviewPeer::REVIEW_DATE, 'to_date('.ReviewPeer::REVIEW_DATE.', \'YYYY-MM-DD\') = '.$con->quote($date->format('Y-m-d'), Criteria::CUSTOM); 
+0

Спасибо за ваш ответ. К сожалению, пользовательский SQL невозможен с тем, что я делаю, поскольку это часть более крупного запроса. –

Смежные вопросы