You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel对接DynamoDB时如何直接获取嵌套data字段内的目标数据

Laravel查询DynamoDB嵌套字段打平返回方案

问题说明

当前DynamoDB表module_details存储结构如下:

{
 "subdomain": "subdomain",
 "uuid": "uuid_1234",
 "data": {
  "credit_limit": 1200,
  "id": 1234,
  "name": "Allan",
  "number": 651234568
 }
}

现有查询代码如下:

$dynamo = DB::connection('dynamo')
                ->table('module_details')
                ->whereIndex('subdomain-index')
                ->where('uuid', '=', strtolower($this->Class).'_'.array_get($result['data'], 'id'))
                ->wherePartitionKey('subdomain', '=', Config::get('node.subdomain'))
                ->select('data')
                ->get();

执行后返回结果会携带外层data键,结构如下:

"data": {
  "credit_limit": 1200,
  "id": 1234,
  "name": "Allan",
  "number": 651234568
 }

期望直接返回data字段内部的credit_limit、id、name、number字段,无外层data键包裹。

解决方法

DynamoDB原生查询逻辑不会自动将嵌套对象打平到根层级返回,可通过以下两种方案实现需求:

  • 方案1:查询后通过Laravel集合方法转换结构(兼容性最高,推荐)
    不需要调整原有查询条件,在get()后调用集合的map方法重构返回结构即可,性能开销极低:
    $dynamo = DB::connection('dynamo')
        ->table('module_details')
        ->whereIndex('subdomain-index')
        ->where('uuid', '=', strtolower($this->Class).'_'.array_get($result['data'], 'id'))
        ->wherePartitionKey('subdomain', '=', Config::get('node.subdomain'))
        ->select('data')
        ->get()
        ->map(function ($item) {
            // 直接返回data字段内容即可去掉外层键
            // 若需过滤多余字段,可使用Arr::only指定返回字段
            return \Illuminate\Support\Arr::only(
                (array)$item->data, 
                ['credit_limit', 'id', 'name', 'number']
            );
        });
    
  • 方案2:查询时直接指定嵌套字段路径(依赖驱动支持)
    部分Laravel DynamoDB扩展包支持用点语法指定嵌套文档的查询路径,可直接在select中声明需要返回的嵌套字段:
    $dynamo = DB::connection('dynamo')
        ->table('module_details')
        ->whereIndex('subdomain-index')
        ->where('uuid', '=', strtolower($this->Class).'_'.array_get($result['data'], 'id'))
        ->wherePartitionKey('subdomain', '=', Config::get('node.subdomain'))
        // 直接声明嵌套字段路径
        ->select(['data.credit_limit', 'data.id', 'data.name', 'data.number'])
        ->get();
    

    注意:该方法依赖你当前使用的DynamoDB连接驱动对文档路径语法的支持,如果执行后报错或字段不识别,直接使用方案1即可。


内容的提问来源于stack exchange,提问作者korugane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:39:28