Der er ikke noget galt med din forespørgsel. Det er dit miljø.
Problem
Laravels MySqlGrammar
oversætter field->key
notation i feltnavne (på Laravel-siden) til field->'$.key'
-stil-udtræk (på MySQL-siden):
/** * Indpak den givne JSON-vælger. * * @param streng $værdi * @returstreng */beskyttet funktion wrapJsonSelector($værdi){ $sti =eksplodere('->', $værdi); $field =$this->wrapValue(array_shift($path)); $path =collect($path)->map(function ($part) { return '"'.$part.'"'; })->implode('.'); // Her:returner sprintf('%s->\'$.%s\'', $field, $path);}
Jeg har lige bekræftet, at MariaDB ikke understøtter -> udvindingsoperatør
som et alias til
fungere. Den samme forespørgsel virker dog mod en vanilla MySQL 5.7-server.
Forudsat denne test
tabel:
╔════╤══════════════════╗║ id └│ nyttelast ║ ──────────╢║ 1 │ {"a":1, "b":2} ║╚════╧═══════════ ══╝
En forespørgsel, der bruger ->
ekstraktionsoperatør:
VÆLG nyttelast->"$.b" FRA test;
fejler mod MariaDB 10.2.8, mens det giver en korrekt 2
mod en MySQL 5.7.19-server.
Løsninger
Den rigtige løsning afhænger af, hvad du bruger i produktionen.
Erstat MariaDB
Hvis du bruger MySQL, skal du erstatte MariaDB med MySQL i din udviklings-env. På en macOS-maskine, der administreres af homebrew, ville det være så nemt som:
brew services stop mysqlbrew afinstaller mariadbrew install mysqlbrew services start mysql
dine data forbliver intakte.
Omskriv dine forespørgsler
Men hvis du bruger MariaDB i produktionen, skal du omskrive dine forespørgsler for at bruge JSON_EXTRACT()
fungere som Elias allerede nævnt
. Som du kan se, skal du være meget mere udførlig med Laravel API.
Ovenstående forespørgsel ville være:
SELECT JSON_EXTRACT(nyttelast, "$.b") FRA test;