Doctrant无法返回json查询的结果

时间:2016-06-23 14:08:20

标签: php postgresql orm doctrine-orm

可能有关闭标题的主题但我无法解决此问题。以下查询从psql命令行或任何Postgresql客户端应用程序调用时返回预期结果 但是当我用Doctrine 2实现查询时,我得到以下错误/异常。

raw_data字段是JSON类型。

查询:

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' ^

回应(例外)

"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": "somauser@example.com",
  "NatureID": null,
  "PartySubNatureID": null,
  "CityID": "123",
  "CountyID": "456",
  "DistrictID": "789",
  "id": 14487,
  "userId": 35754
}

'公司的内容' raw_data有效负载上的字段如下所示。

{{1}}

版本 Postgresql :x86_64-apple-darwin14.5.0上的PostgreSQL 9.5.2,由Apple LLVM 7.0.2版(clang-700.1.81)编译,64位

Doctrine - DBAL :v2.5.2

1 个答案:

答案 0 :(得分:1)

我猜,它不是您的数据或字段,它与PDO及其绑定参数方法有关。如果不使用?条件,则可以轻松处理错误。因为doctrine dbal当然是pdo(在基础中)假设这个?条件操作符作为查询绑定参数,并且转换此绑定参数以匹配变量值是thr。事实上,你没有任何价值可供选择。因为它只是有条件的opeartor。

要处理此问题,您可以轻松使用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;

我测试了。两个查询都给出相同的结果。

很多db库都有这个问题: