2016-06-23 2 views
0

могут быть потоки с близкими заголовками, но я не мог решить эту проблему. Следующий запрос возвращает ожидаемые результаты при вызове из командной строки psql или любого клиентского приложения Postgresql , но когда я реализую запрос с Doctrine 2, я получаю следующее сообщение об ошибке/исключении.Возврат результатов доктрины по json-запросам

raw_data поле в JSON type.

Запрос:

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(); 
} 

Response (Exception)

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, составленный Apple, LLVM версии 7.0.2 (лязг-700.1.81), 64-битный

Учение - DBAL: V2.5.2

ответ

1

Я думаю, это не aobut ваших данных или полей, это связано с PDO и их параметров связывания подхода. Вы можете легко справиться с ошибкой, если не используете условие ?. Поскольку доктрина dbal и, конечно же, pdo (в базе), предположим, что этот оператор ? является параметром привязки запроса, и это необходимо для преобразования этого параметра привязки в соответствие с значением переменной. На самом деле у вас нет никакой ценности, чтобы соответствовать. Потому что это только условный выбор.

Для решения этой проблемы вы можете легко использовать функцию postgres jsonb_exists(column_name, key). Я пытаюсь создать правильную версию вашего примера с помощью функции 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 – ilhnctn

Смежные вопросы