【问题标题】:How could I make join with column type text contains JSON array using Laravel query builder如何使用 Laravel 查询生成器加入包含 JSON 数组的列类型文本
【发布时间】:2021-01-10 13:28:16
【问题描述】:

我想使用包含 JSON 数组且列类型为文本的列进行连接。 交易表

id type
1 cash
2 cash
3 credit

route_activities 表

id transactions
1 [{transaction_id:"1"},{transaction_id:"2"}]
2 [{transaction_id:"2"}]

所以我正在尝试使用这些代码

$sale_data = DB::table('route_activities')
            ->Join('routes','routes.driver_id','=','route_activities.driver_id')
            ->Join('transactions','transactions.transaction_id',
                DB::Raw("route_activities.transactions->'$[*].transaction_id',CAST(transactions.transaction_id as JSON)")
            )
            ->selectRaw('
                route_activities.activity as activity,
                route_activities.check_in as check_in,
                route_activities.date as date,
                route_activities.check_out as check_out,
                route_activities.coordinates as coordinates,
                CASE WHEN visit_status = "Productive" THEN "true" ELSE "false" END as is_productive
            ')
            ->get();

它不工作。 我得到了一些链接thisthis

但他们都没有给我我想要的东西。任何帮助:)?

我正在使用 Laravel-v7.30。和 MySQL v5.7

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    你在寻找这样的东西吗?

    SELECT a.*, t.* 
    FROM route_activities a
    JOIN transactions t ON JSON_CONTAINS(
      JSON_EXTRACT(a.transactions, '$[*].transaction_id'), 
      JSON_QUOTE(CONVERT(t.id, char)), 
      '$'
    );
    

    这应该会产生类似的结果:

    trans_id transactions type
    1 [{"transaction_id": "1"}, {"transaction_id": "2"}] cash
    1 [{"transaction_id": "1"}, {"transaction_id": "2"}] cash
    2 [{"transaction_id": "3"}] credit

    看到您已经在使用selectRaw,您可以在DB::select(..) 中输入查询,如下所示:

    DB::select("ra.activity as activity,
                ra.check_in as check_in,
                ra.date as date,
                ra.check_out as check_out,
                ra.coordinates as coordinates,
                CASE WHEN visit_status = "Productive" THEN "true" ELSE "false" END as is_productive 
                FROM route_activities ra
                JOIN transactions t ON JSON_CONTAINS(json_extract(a.transactions, '$[*].transaction_id'), json_quote(convert(t.id, char)), '$')
                JOIN routes r ON r.driver_id = ra.driver_id")
    ->get()
    

    考虑到路线活动会重复,我不知道结果集是否可以按原样使用,但我希望这能为您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2016-10-07
      • 2014-04-10
      • 2016-07-05
      • 1970-01-01
      • 2013-08-07
      • 2018-11-14
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多