Используйте Doctrine для поиска в столбце базы данных json. - PullRequest
0 голосов
/ 17 марта 2020

У меня есть проект Symfony 3.2, и мне нужно отфильтровать данные из столбца json . Учитывая, что у нас есть сущность с именем "pack" со столбцом json с именем "settings" , содержащим данные такого типа:

{
  "name": "My pack",
  "blocks": [
    {
      "name": "Block 1",
      "fields": [
        {"label": "A", "value": "57"},
        {"label": "B", "value": "100"}
      ]
    },
    {
      "name": "Bock 2",
      "fields": [
        {"label": "C", "value": "80"}
      ]
    }
  ]
}

Я должен поиск упаковывает с полем, которое имеет метку "B" и его значение в "100", но каждый pack не делает имеют одинаковый порядок блоков и полей. Поэтому в моем репозитории используются Doctrine \ ORM \ EntityRepository и opsway / doctrine -dbal- postgresql (для функций GET_JSON_FIELD и GET_JSON_OBJECT ) , этот вид условия работает:

use Doctrine\ORM\EntityRepository;

class Packs extends EntityRepository
{
  public function findFiltered(...)
  {
    return $this->createQueryBuilder('pack')
      ->andWhere("GET_JSON_FIELD(GET_JSON_OBJECT(pack.settings, '{blocks,0,fields,1}'), 'label') = :label")
      ->andWhere("GET_JSON_FIELD(GET_JSON_OBJECT(pack.settings, '{blocks,0,fields,1}'), 'value') = :value")
      ->setParameter('label', 'B')
      ->setParameter('value', '100')
    ;
  }
}

Но проблема в том, что мне нужно указать точный блок (первый объект блока) и точное поле (второй объект поля первого блочного объекта) . И два моих условия не связаны, он ищет, если есть метка "B", то он ищет, если есть значение "100". Когда я хотел бы провести исследование по всем блокам и полям, чтобы найти хороший ярлык для хорошего значения. Есть идеи?


Я нашел хороший запрос SQL для Моя проблема:

SELECT *
FROM pack p, json_array_elements(p.settings#>'{blocks}') blocks, json_array_elements(blocks#>'{fields}') fields
WHERE  fields->>'label' = 'B' and fields->>'value' = '100';

Но как мне это сделать с doctrine?

...