Странное поведение с Doctrine_Query в Doctrine 1.2

У меня есть запрос с несколькими операторами orWhere. Код PHP выглядит следующим образом:

$firstDay = $params['datetimeForMonth']->format('Y-m-d');
$lastDay = $params['datetimeForMonth']->format('Y-m-t 23:59:59');
$whereStatement = "(s.level = ?
    AND s.idForLevel IN (?) 
    AND s.startDatetime BETWEEN '$firstDay' AND '$lastDay')";
$q = Doctrine_Query::create()
    ->from('Mmb_Model_Schedule s')
    ->where($whereStatement, ['prefecture', $this->id])
    ->orWhere($whereStatement, ['district', $districtIds])
    ->orWhere($whereStatement, ['municipality', $municipalityIds])
    ->orWhere($whereStatement, ['workplace',    $workplaceIds])
    ->orWhere($whereStatement, ['user', $userIds]);

Переменные $districtIds, $municipalityIds, $workplaceIds и $userIds определены заранее как значения, разделенные запятыми.

Этот запрос отлично работает со всеми уровнями, кроме идентификаторов районов. Любая запись с уровнем «район» не будет возвращена в запросе.

Что действительно странно, так это то, что если я не использую связанные параметры, а вставляю следующий код, все работает нормально:

->orWhere("s.level = 'district' AND s.idForLevel IN ($districtIds) AND s.startDatetime BETWEEN '$firstDay' AND '$lastDay'")

Что еще более бесит, так это то, что даже этот запрос, выполненный сам по себе как один оператор where (исключая все остальные), также ничего не дает мне, если я использую связанные параметры.

И как будто этого было недостаточно, я даже попытался обновить таблицу, изменив «район» на «префрайон», на тот случай, если слово «район» вызывало проблемы. Ничего не изменилось.

Несмотря на то, что я вставляю ТОЧНО ТЕ ЖЕ данные в качестве связанных параметров, что и при их непосредственном вводе, поведение резко меняется. Что здесь происходит?


person blainarmstrong    schedule 17.04.2013    source источник


Ответы (1)


Я хочу сказать, что в значениях переменной $districtIds должно быть что-то, что сбивает построителя запросов в Doctrine. Можете ли вы опубликовать образец того, что это за значения?

Кроме того, вы смотрели на сгенерированный SQL, который запускает доктрина (либо хвост журнала SQL, либо подключение к событию preExecute)? Мне было бы любопытно увидеть результат чего-то подобного.

(вероятно, это должен быть комментарий, но моя репутация недостаточно высока для этого;))

person Jay Klehr    schedule 21.05.2013
comment
Это не что иное, как целочисленные значения. - person blainarmstrong; 22.05.2013