2016-06-23 16 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 

Doctrineの実装:

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とそれらのバインド・パラメータのアプローチに関連して、あなたのデータまたはフィールドaobutではありません。 ?の条件を使用しないと、エラーを簡単に処理できます。 doctrine dbalともちろんpdo(ベースで)は、この?という条件のopeatorをクエリバインディングパラメータとみなし、このバインドパラメータを変数値に一致させるために変換します。実際にあなたは一致する価値がありません。それは条件付きのopeartorだけなので。

この問題を処理するには、postgresの機能を簡単に使用できます。私はあなたの例の正しいバージョンを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

関連する問題