Mysql
 sql >> база данни >  >> RDS >> Mysql

JSON селекторът за създаване на заявки на Laravel `поле->ключ` причинява синтактична грешка

Няма нищо лошо в запитването ви. Това е вашата среда.

Проблем

MySqlGrammar превежда поле->ключ нотация в имената на полета (от страната на Laravel) в field->'$.key' -стил екстракции (от страна на MySQL):

/**
 * Wrap the given JSON selector.
 *
 * @param  string  $value
 * @return string
 */
protected function wrapJsonSelector($value)
{
    $path = explode('->', $value);

    $field = $this->wrapValue(array_shift($path));

    $path = collect($path)->map(function ($part) {
        return '"'.$part.'"';
    })->implode('.');

    // Here:
    return sprintf('%s->\'$.%s\'', $field, $path);
}

Току-що потвърдих, че MariaDB не поддържа -> оператор на добив като псевдоним на JSON_EXTRACT() функция. Въпреки това, същата заявка работи срещу ванилен MySQL 5.7 сървър.

Ако приемем този тест таблица:

╔════╤══════════════════╗
║ id │ payload          ║
╟────┼──────────────────╢
║  1 │ {"a": 1, "b": 2} ║
╚════╧══════════════════╝

Заявка, която използва -> оператор за извличане:

SELECT payload->"$.b" FROM test;

не успява срещу MariaDB 10.2.8, докато дава правилен 2 срещу MySQL 5.7.19 сървър.

Решения

Правилното решение зависи от това, което използвате при производството.

Заменете MariaDB

Ако използвате MySQL, заменете MariaDB с MySQL във вашата среда за разработка. На машина с macOS, управлявана от homebrew, би било толкова лесно, колкото:

brew services stop mysql
brew uninstall mariadb
brew install mysql
brew services start mysql

вашите данни ще останат непокътнати.

Пренапишете вашите заявки

Въпреки това, ако използвате MariaDB в производството, трябва да пренапишете заявките си, за да използвате JSON_EXTRACT() функционира като Елиас вече спомена . Както можете да видите, трябва да сте много по-подробни с API на Laravel.

Горната заявка би била:

SELECT JSON_EXTRACT(payload, "$.b") FROM test;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL с помощта на Sum и Case

  2. При импортиране на MySQL:ГРЕШКА на ред 32769:Неизвестна команда „\“

  3. Как да програмирам MySQL тригер за вмъкване на ред в друга таблица?

  4. Гео разстояние MySQL

  5. Да се ​​вмъкнат ли няколко реда от масив, запазен в сесия, в таблица?