クエリに問題はありません。それはあなたの環境です。
問題
Laravelの MySqlGrammar
field-> key
を翻訳します フィールド名(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()
関数。ただし、同じクエリがバニラMySQL5.7サーバーに対して機能します。
このtest
を想定 表:
╔════╤══════════════════╗
║ id │ payload ║
╟────┼──────────────────╢
║ 1 │ {"a": 1, "b": 2} ║
╚════╧══════════════════╝
->
を使用するクエリ 抽出演算子:
SELECT payload->"$.b" FROM test;
正しい2
を生成している間、MariaDB10.2.8に対して失敗します MySQL5.7.19サーバーに対して。
ソリューション
適切なソリューションは、本番環境で何を使用しているかによって異なります。
MariaDBを置き換えます
MySQLを使用している場合は、開発環境でMariaDBをMySQLに置き換えます。自作で管理されているmacOSマシンでは、次のように簡単にできます。
brew services stop mysql
brew uninstall mariadb
brew install mysql
brew services start mysql
データはそのまま残ります。
クエリを書き直します
ただし、本番環境でMariaDBを使用している場合は、 JSON_EXTRACT()
を使用するようにクエリを書き直す必要があります。 すでに述べたエリアス
として機能します 。ご覧のとおり、LaravelAPIを使用する場合はもっと詳細にする必要があります。
上記のクエリは次のようになります:
SELECT JSON_EXTRACT(payload, "$.b") FROM test;