У меня есть проект 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?