2016-06-23 7 views
0

제목이 가까운 스레드가있을 수 있지만이 문제를 해결할 수 없었습니다. 다음 쿼리는 psql 명령 줄 또는 PostgreSQL 클라이언트 응용 프로그램에서 호출 할 때 예상 결과를 반환하지만 Doctrine 2를 사용하여 쿼리를 구현할 때 다음 오류/예외가 발생합니다.Doctrine cant는 json 쿼리에서 결과를 반환합니다.

raw_data 필드는 JSON 유형입니다.

검색어 :

SELECT 
     DISTINCT (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER 
    FROM schema.projects p 
    WHERE p.raw_data :: JSONB ? 'company' 
      AND (p.raw_data ->> 'company') :: JSONB ? 'userId' 
      AND (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER > 0 
      AND p.is_deleted = FALSE 
     LIMIT 20; 
-- Returns 20 results 

교리 구현 :

public function fetchResulst() 
{ 
    $sql = " 
     SELECT 
     DISTINCT (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER 
     FROM schema.projects p 
     WHERE p.raw_data :: JSONB ? 'company' 
      AND (p.raw_data ->> 'company') :: JSONB ? 'userId' 
      AND (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER > 0 
      AND p.is_deleted = FALSE 
      LIMIT 20 
    )"; 

    return $this->_em->getConnection()->executeQuery($sql)->fetchAll(); 
} 

응답 (예외)

Doctrine \ DBAL \ Exception \ SyntaxErrorException 
    An exception occurred while executing ' SELECT DISTINCT (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER FROM listing.projects p WHERE p.raw_data :: JSONB ? 'company' AND (p.raw_data ->> 'company') :: JSONB ? 'userId' AND (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER > 0 AND p.is_deleted = FALSE LIMIT 20) ': SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1" LINE 5: WHERE p.raw_data :: JSONB $1 'company'^

raw_data 페이로드에 '기업'필드의 내용은 다음과 같습니다.

"company": { 
    "CompanyID": 112233445566, 
    "URL": null, 
    "CompanyName": "Some Real Estate Bla bla Contact Office", 
    "PartyNature": "Contact Office", 
    "CompanyType": 26, 
    "SubNature": null, 
    "Description": "", 
    "DescriptionLocal": "", 
    "ImagePath": null, 
    "Phone1": "+90 987 111 11 11", 
    "Phone2": "", 
    "Fax": null, 
    "ContactEmail": "[email protected]", 
    "NatureID": null, 
    "PartySubNatureID": null, 
    "CityID": "123", 
    "CountyID": "456", 
    "DistrictID": "789", 
    "id": 14487, 
    "userId": 35754 
} 

버전 : PostgreSQL을 : PostgreSQL의 9.5.2 x86_64에-사과 darwin14.5.0에 애플 LLVM 버전 7.0.2 (그 소리-700.1.81), 64 비트에 의해 컴파일

교리 - DBAL : v2.5.2 것 같아요

답변

1

, 그것은 데이터 또는 필드 하는게 먼지 너도, 그것은 PDO과 바인드 매개 변수 접근 방식으로 관련이 없습니다. ? 조건을 사용하지 않으면 쉽게 오류를 처리 할 수 ​​있습니다. Doctrine dbal과 당연히 pdo (베이스에서)가이 ? 조건 opeator를 쿼리 바인딩 매개 변수로 가정하고이 바인드 매개 변수를 변수 값과 일치하도록 변환하는 것이기 때문에. 사실, 당신은 일치시킬만한 가치가 없습니다. 그것은 조건부 opeartor이기 때문에.

이 문제를 해결하려면포스트 그레스 기능을 쉽게 사용할 수 있습니다. 아래의 jsonb_exists 함수로 올바른 버전의 예제를 만들려고합니다.

$sql = " 
    SELECT 
    DISTINCT (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER 
    FROM schema.projects p 
    WHERE jsonb_exists(p.raw_data :: JSONB, 'company') 
     AND jsonb_exists((p.raw_data ->> 'company') :: JSONB, 'userId') 
     AND (((p.raw_data ->> 'company') :: JSONB) ->> 'userId') :: INTEGER > 0 
     AND p.is_deleted = FALSE 
     LIMIT 20 
    "; 
    $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 

    var_dump($em->getConnection()->executeQuery($sql)->fetchAll()); exit; 

나는 테스트를 거쳤습니다. 두 쿼리 모두 동일한 결과를 제공합니다.

+0

는, 대단히 @hkulekci 감사합니다 : DB 라이브러리의

많은이 문제가 – ilhnctn

관련 문제