PHP Yi2中的PostgreSQL json选择查询替换

PHP Yi2中的PostgreSQL json选择查询替换,php,json,postgresql,yii2,postgresql-9.4,Php,Json,Postgresql,Yii2,Postgresql 9.4,PHP Yii2中是否有此查询的替换项 从my_表中选择*,其中my_列?&数组['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['

PHP Yii2中是否有此查询的替换项

从my_表中选择*,其中my_列?&数组['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=“从my_表中选择*其中包含my_列?&array['2','1','3','4'];”

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

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

该数据库有:

  • [“1”、“2”、“3”、“4”]
  • [“1”、“2”、“3”]
  • 它在pgAdmin3 SQL编辑器中工作


    转义SQL字符串可能是缺少的内容。因此,类似这样的方法在理想情况下应该是可行的:

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

    作为一个快速的临时解决方案,我使用了
    pg\u查询

    $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);
    
    $host=“localhost”;
    $user=“test”;
    $pass=“test”;
    $db=“测试”;
    $con=pg_connect(“host=$host dbname=$db user=$user password=$pass”)
    或死亡(“无法连接到服务器\n”);
    //我的列类型是jsonb
    $query=“从my_表中选择*,其中my_列?&array['2','1','3']”;
    $rs=pg_query($con,$query)或die(“无法执行查询:$query\n”);
    $data=array();
    而($row=pg_fetch_assoc($rs)){
    $data[]=$row;
    }
    回声“;
    打印(数据);
    pg_关闭($con);
    

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

    在PostgreSQL中,
    jsonb_exists()
    函数的别名
    ?&
    jsonb\u exists\u all()
    的别名。因此,您可以这样编写查询:


    PostgreSQL喜欢使用带编号的占位符(即
    $1
    $2
    ,…),因此PHP中的某些东西正在将
    中的
    转换为
    $1
    ,就好像
    是占位符一样。这就是奇怪的
    $1
    的来源。抱歉,我对PHP接口了解不够,无法告诉您如何修复它。第一个想法是在
    yii\db\Expression
    中包装
    $sq
    l,但似乎没有帮助。
    ERROR:syntax ERROR在“\”
    处或附近,它生成了
    \$1&
    请参见和。似乎不是必需的。PostgreSQL需要“?”来比较
    JSON
    pg\u query():查询失败:错误:jsonb\u exists\u all处或附近的语法错误
    我尝试过这个:
    TestModel::find()->where(“jsonb\u exists\u all”(我的列,数组['2',',',3',4'])”->asArray()->all()正如我对Yii2所需要的那样,它成功了!它解决了我的问题,你太棒了!谢谢:)
    
    SELECT * FROM my_table WHERE jsonb_exists_all('my_column', array['2', '1', '3', '4']);