EntityRepository search Json Field

Moin zusammen,

ich versuche in einem EntityRepository eine Entity anhand eines JSON Datenbankfeldes zu finden:

$superEntity = $this->superRepository->searchIds((new Criteria())->addFilter(new AndFilter([
            new EqualsFilter('measurements', json_encode($super['measurements'])),
        ])), $context->getContext())->firstId();

Ich habe bisher nur nach Entities gesucht wo ein String drin stehen sollte. Wie kann ich prüfen, ob in dem JSON-Feld in der Datenbank ein bestimmter Key/Value steht?

In der entsprechenden JSON-Spalte in der Datenbank steht sowas wie:

{"width": 500, "length": 500, "diameter": 500, "innerDiameter": 50, "outerDiameter": 500}

Das oben versuchte json_encode() macht vermutlich nicht die gleichen Spaces, weshalb der String nicht identisch ist, aber das wäre sowieso nur die halbe Lösung.

Eigentlich möchte ich mir eine beispielsweise eine Entity suchen, die innerhalb des JSON-Feldes z.B: „width“ == 500 hat.

Hat jemand eine Idee?

wird aber vermutlich eher nicht das sein, was du suchst.

Dann ggf. eine eigene Query erstellen mit JSON_CONTAINS. Oder das ganze JSON als String behandeln und einfach nach „x: y“ suchen, falls das möglich ist – noch nie versucht.

Hast du es mit folgendem versucht?

new EqualsFilter('measurements.width', 500))

Eventuell auch mit "500"?

2 „Gefällt mir“

Genau das habe ich gesucht, vielen Dank!

Ich hab versucht mich hierzu ein wenig durch den Core zu lesen - woher wusstest du, dass das so funktioniert? Hast du einen Tipp, wie ich das nachvollziehen kann?

Ich schon etwas länger her, da habe ich auch nach customFields gefiltert und hatte daher in Erinnerung, das dies klappen müsste.

Aber Performance gesehen, ist es nicht zu empfehlen nach einem JSON Feld zu filtern. Dann lieber die Daten in einer eigenen Entity/Spalte speichern.