sql >> Database teknologi >  >> RDS >> Mysql

Laravels forespørgselsbygger JSON-vælger `felt->nøgle` forårsager syntaksfejl

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 JSON_EXTRACT() 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; 


  1. Find ud af, om en varchar indeholder et procenttegn, i MySQL

  2. Bedste måde at validere brugerinput JDBC?

  3. post omdøbt filnavn fra upload til database

  4. Datatabeller side 2 af paginering kalder ikke Magnific Popup