2012-07-06 2 views
0

내 쿼리에 위치 매개 변수가 없기 때문에이 오류가 발생합니다. 여기 방법 :SQLSTATE [HY093] : 유효하지 않은 매개 변수 번호 : 명명 된 위치 매개 변수와 혼합 된 매개 변수

public function getAll(User $user, DateTime $start = null, DateTime $end = null) 
{ 
    $params = array('user_id' => $user->getId()); 

    $rsm = new \Doctrine\ORM\Query\ResultSetMapping(); // Result set mapping 
    $rsm->addScalarResult('subtype', 'subtype'); 
    $rsm->addScalarResult('count', 'count'); 

    $sms_sql = 
    "SELECT CONCAT('sms_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " . 
    "SUM(messages_count * (customers_count + recipients_count)) AS count " . 
    "FROM outgoing_message AS m INNER JOIN small_text_message AS s ON " . 
    "m.id = s.id WHERE status <> 'pending' AND user_id = :user_id"; 

    $news_sql = 
    "SELECT CONCAT('news_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " . 
    "SUM(customers_count + recipients_count) AS count " . 
    "FROM outgoing_message AS m JOIN newsletter AS n ON m.id = n.id " . 
    "WHERE status <> 'pending' AND user_id = :user_id"; 

    if($start) : 
     $sms_sql  .= " AND sent_at >= :start"; 
     $news_sql  .= " AND sent_at >= :start"; 
     $params['start'] = $start->format('Y-m-d'); 
    endif; 

    $sms_sql .= ' GROUP BY type, is_auto'; 
    $news_sql .= ' GROUP BY type, is_auto'; 

    return $this->_em->createNativeQuery("$sms_sql UNION ALL $news_sql", $rsm) 
     >setParameters($params)->getResult(); 
} 

그리고이 예외 예외 :

SQLSTATE [HY093] : 유효 파라미터 번호 : 명명 된 혼합 위치 파라미터

배열 $params가 OK이고 그래서 generated SQL :

var_dump($params); 

array (size=2) 
    'user_id' => int 1 
    'start' => string '2012-01-01' (length=10) 

이상한 점은 "$sms_sql"에서만 작동한다는 것입니다.

업데이트

다른 이상한 것을 발견했습니다. 나는 (start_date 대신 start의에) 이름 만 변경하는 경우 :

교리/PDO는 말한다
if($start) : 
     $sms_sql    .= " AND sent_at >= :start_date"; 
     $news_sql   .= " AND sent_at >= :start_date"; 
     $params['start_date'] = $start->format('Y-m-d'); 
    endif; 

무엇 발생하는 것을 :

SQLSTATE [42S22] : 발견되지 칼럼 : 1054 알 수없는 열 'sent1rt_date ' 에서'where 절 '문자열 1rt는 열 이름의 중간에 추가 된로

...!

+0

이 줄은 "SUM (messages_count * (customers_count + recipients_count)) AS count"를 사용하여 mysql 명령 줄을 열고 쿼리 만 테스트 할 수 있습니까? – jcho360

+0

@ jcho360 내가 $ sms_sql 쿼리를 사용하는 경우 작동합니다 줄을 잘 작동합니다! – gremo

+0

SQL에 이상한 점이 있지만 문제가 아닌 것 같습니다. status, user_id, sent_at, is_auto 및 type 열에 대한 참조는 qualifier가 아니며 테이블 별칭이 아닙니다. SELECT 목록의 별칭으로 "count"라는 예약어를 사용하고 있습니다 (실제로 백틱으로 묶어야 함). 조금 이상하지만 '유형'별로 그룹화했지만 해당 열은 쿼리의 다른 곳에 포함되지 않습니다. 그것은 합법적입니다, 조금 이상합니다. 테이블 별칭으로 자격을 얻었습니다. 그러나 그 중 아무 것도 정말로 문제는 아닙니다. – spencer7593

답변

1

문제는 NativeSQL의 Doctrine ORM 지원과 관련이 있다고 생각합니다.

setParameters 메서드의 설명서에서 명명 된 매개 변수에 사용 된 예제가 없습니다. 내가 사용하고있는 그 방법을 보는 모든 예는 명명되지 않고 위치에 대한 것입니다.

명명 된 매개 변수의 모든 예제는 setParameter ("s"없음) 메서드를 사용합니다. 또한 SQL에 일치하는 자리 표시 자의 단일 항목 만 표시합니다.

테스트 (및 가능한 해결 방법)로 SQL 텍스트의 각 자리 표시자를 고유하게 만든 다음 각각을 별도로 설정하십시오.

"명명 된 매개 변수"지원이 다소 불완전 할 수 있습니다 (우리가 Oracle 및 다른 ORM 프레임 워크에서 사용했던 것과 비교). Doctrine은 위치 표기법을 더 잘 지원할 수 있습니다. (간단한 문장에서는 좋지만 매개 변수가 많으면 SQL 문을 변경해야합니다. 이름이 지정된 매개 변수의 이점이 실제로 빛나기 시작합니다. 바로 지원.) 여기

교리 ORM 문서 http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html?highlight=setParameters에 대한 링크입니다 (예는 해당 페이지에 setParameters를 검색합니다.)

는 (귀하의 질문에 내 의견을 참조하십시오.) 수도 정말 답

을 귀하의 질문,하지만 그것은 올바른 방향으로 움직일 수 있습니다. 밖에 조심해라.

관련 문제