【问题标题】:PostgreSQL json select query replacement in PHP Yii2PHP Yii2中的PostgreSQL json选择查询替换
【发布时间】:2015-06-19 13:04:44
【问题描述】:

在 PHP Yii2 中这个查询有什么替代品吗?

SELECT * FROM my_table WHERE my_column ?& array['2', '1', '3', '4'];

my_column = jsonb

因为我得到了这个错误

Error Info: Array
(
  [0] => 42601
  [1] => 7
  [2] => ERROR:  syntax error at or near "$1"
  LINE 1: SELECT * FROM my_table WHERE my_column $1& array['2', '1', '3',       '...
                                                 ^
)

我正在使用 PHP Yii2 和 PostgreSQL 9.4

$sql = "SELECT * FROM my_table WHERE my_column ?& array['2', '1', '3', '4'];";

$model = TestModel::findBySql($sql)->asArray()->all();

此查询的目的是比较数据库中是否存在该值。

数据库有:

  1. ["1", "2", "3", "4"]
  2. ["1", "2", "3"]

它可以在 pgAdmin3 SQL 编辑器中使用。

PostgreSQL 9.41 jsonb Operators

【问题讨论】:

  • PostgreSQL 喜欢使用带编号的占位符(即$1$2、...),因此 PHP 中的某些东西将 ?& 中的 ? 转换为 $1,就好像 @ 987654333@ 是一个占位符。这就是奇怪的$1 的来源。对 PHP 接口了解不够,无法告诉您如何修复它,抱歉。
  • 最初的想法是将$sql 包裹在yii\db\Expression 中,但似乎没有帮助。

标签: php json postgresql yii2 postgresql-9.4


【解决方案1】:

在 PostgreSQL 中,?jsonb_exists() 函数的别名。 ?&jsonb_exists_all() 的别名。因此,您可以像这样编写查询:

SELECT * FROM my_table WHERE jsonb_exists_all('my_column', array['2', '1', '3', '4']);

【讨论】:

  • PHP Warning – yii\base\ErrorException pg_query(): Query failed: ERROR: syntax error at or near jsonb_exists_all
  • 我试过这个:TestModel::find() ->where("jsonb_exists_all(my_column, array['2', '1', '3', '4'])") ->asArray() ->all(); 因为我需要 Yii2 并且成功了!它解决了我的问题,你太棒了!谢谢你:)
【解决方案2】:

转义 SQL 字符串可能是缺少的。因此,理想情况下,这样的事情应该可以工作:

SELECT * FROM service WHERE test2 \?& array['2', '1', '3', '4'];

【讨论】:

【解决方案3】:

作为一个快速的临时解决方案,我使用了pg_query

$host = "localhost";
$user = "test";
$pass = "test";
$db = "test";

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
          or die("Could not connect to server\n");

//my_column type is jsonb
$query = "SELECT * FROM my_table WHERE my_column ?& array['2', '1', '3']";

$rs = pg_query($con, $query) or die("Cannot execute query: $query\n");

$data = array();
while ($row = pg_fetch_assoc($rs)) {
  $data[] = $row;
}

echo "<pre>";
print_r($data);

pg_close($con);

但我找不到一种方法让它与Yii2 一起工作。希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2022-01-22
    相关资源
    最近更新 更多