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. ["1", "2", "3", "4"]
  2. ["1", "2", "3"]

И он работает в SQL pgAdmin3 Редактор.

PostgreSQL 9.41 операторы jsonb

3 3

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. надеюсь, это поможет другим.