Выбор диапазона дат, в котором дата не равна нулю, с помощью Propel - PullRequest
2 голосов
/ 05 мая 2010

Используя 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.02.2010, но я не хочу возвращать те записи, в которых due_date равен NULL.

В примере я хочу только вернуть строки 2 и 3.

Однако, Propel, кажется, переписывает мои критерии NOTNULL.

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 мая 2010

Почему вы создаете отдельные 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, поэтому они всегда заменят предыдущие.

2 голосов
/ 05 мая 2010

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

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

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