PHP Yi2中的PostgreSQL json选择查询替换
PHP Yii2中是否有此查询的替换项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['
从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']);