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
相关产品推荐
相关产品推荐

