2013-04-17 4 views
0

orWhere 문이 여러 개인 쿼리가 있습니다.Doctrine 1.2에서 Doctrine_Query로 이상한 동작이 발생했습니다.

$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을, 및 $ 사용자 ID는 모든 앞서 쉼표로 구분 된 값으로 시간의 정의 : PHP 코드는 다음과 같습니다.

이 쿼리는 지구 ID를 제외한 모든 레벨에서 올바르게 작동합니다. "district"레벨의 레코드는 쿼리에서 반환되지 않습니다.

정말로 이상한 것은 내가 바인딩 매개 변수를 사용하는 것이 아니라 다음과 같은 코드를 삽입하지 않으면, 모든 것이 잘 작동한다는 것입니다 :

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

은 무엇보다 화나는이다하는 것은 심지어이 쿼리 자체에 의해 모두 이루어집니다 단일 where 문 (다른 모든 문항 제외)도 바인딩 된 매개 변수를 사용하면 아무 것도 제공하지 않습니다.

그리고 그 충분하지 것처럼, 심지어 단지의 경우 단어 '지구'문제를 일으키는 'prefDistrict'에서 '지구'변경 테이블을 갱신하려고

. 아무것도 바뀌지 않았다. 내가 직접 입력 때와 같이 행 매개 변수로 동일한 데이터를 삽입하고있어 사실에도 불구하고

이 동작은 극적으로 변경됩니다. 지구상에서 무슨 일이 벌어지고있는거야?

답변

0

나는 교리에서 쿼리 빌더를 일인가하는 $districtIds VAR의 값에 뭔가가 있어야한다는 말을합니다. 그 값들이 무엇인지 샘플을 게시 할 수 있습니까? 또한

, 당신은 교리 (중 하나는 SQL 로그를 미행하거나 preExecute 이벤트에 접선)를 실행 생성 된 SQL에서 보았다? 나는 그와 같은 것을 볼 수있는 것이 궁금 할 것입니다.

(댓글 일 가능성이 있지만 평판이 충분하지 않습니다.))

+0

정수 값입니다. – blainarmstrong