PostgreSQL в формате JSON выбрать замену запроса в PHP коде с Yii2
Существует ли какая-либо замена для этого запроса в 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", "2", "3", "4"]
["1", "2", "3"]
И он работает в SQL pgAdmin3 Редактор.
3 ответа:
В PostgreSQL,
?
является псевдонимом для функцииjsonb_exists()
.?&
- псевдоним дляjsonb_exists_all()
. Итак, вы можете написать свой запрос следующим образом:SELECT * FROM my_table WHERE jsonb_exists_all('my_column', array['2', '1', '3', '4']);
Экранирование строки SQL-это, возможно, то, чего не хватает. Поэтому что-то вроде этого должно идеально работать:
SELECT * FROM service WHERE test2 \?& array['2', '1', '3', '4'];
В качестве быстрого временного решения я использовал
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
. надеюсь, это поможет другим.