sql >> データベース >  >> RDS >> Mysql

LaravelのクエリビルダーJSONセレクター`field->key`により構文エラーが発生します

    クエリに問題はありません。それはあなたの環境です。

    問題

    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;
    


    1. MySQLクエリをCSVに変換するPHPコード

    2. Mysql:NOTEXISTSを実行します。パフォーマンスを向上させることは可能ですか?

    3. リーダーが閉じているときに読み取りが無効になります

    4. MySQLのタイムゾーンを設定するにはどうすればよいですか?