

laravel9 のDBでテーブルの一部にjson形式でデータを保存しています。  
json形式のデータから「特定のキー」の値だけを抜き出して、出力用のデータを作ろうとしています。

目的のデータは下記のSQLを実行することで得ることが確認できました。

[code]

    SELECT jt.value
    FROM logs
    CROSS JOIN JSON_TABLE(
        logs.query,
        '$' COLUMNS ( value text PATH '$.name')
    ) jt
    
[/code]

しかしながら、このSQLをLaravel上ではどのように表現するのか分からずにいます。  
下記のようなコードを書いてみましたが、エラーになってしまいます。

[code]

    $q= LogAction::query()->selectRaw(
        "DISTINCT jt.value,
        JSON_TABLE(logs.query,
        '$' COLUMNS( value TEXT PATH '$.{$request->key}')
        ) AS jt");
    $q->get();
    
[/code]

`SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
your SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near 'JSON_TABLE(logs.query, '$'`

$query->toSql() で確認すると次のようなsqlが発行されていました

[code]

    select DISTINCT jt.value,
                    JSON_TABLE(logs.query,
                    '$' COLUMNS( value TEXT PATH '$.name')
                    ) AS jt from `logs`
    
[/code]

このような場合にどのように対応すればよろしいでしょうか？  
よろしくお願いします。


CC BY-SA 4.0
2022-10-28T00:14:10.423
91869
2022-11-26T05:38:10.677
7980
question
mysql laravel
laravel9 でDB内の json データから値を抽出して利用する方法


Modelクラスを利用しないのであれば下記で同様のクエリを実行できます。  
$logsには結果セットが返ってくるので、foreachで各行の値を取得できます。

[code]

    $query =
    "SELECT jt.value
    FROM logs
    CROSS JOIN JSON_TABLE(
        logs.query,
        '$' COLUMNS ( value text PATH '$.name')
    ) jt";
    
    $logs = DB::select(DB::raw($query));
    
[/code]


CC BY-SA 4.0
2022-11-13T09:41:30.407
92204
2022-11-13T09:41:30.407
49296
91869
answer


JSONカラムの特定のキーは`->`で直接指定できる。

[code]

    $users = DB::table('users')
                    ->where('preferences->dining->meal', 'salad')
                    ->get();
    
[/code]


CC BY-SA 4.0
2022-11-26T05:38:10.677
92441
2022-11-26T05:38:10.677
21074
91869
answer