Няма нищо лошо в запитването ви. Това е вашата среда.
Проблем
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;