在 Laravel 6 中,由于接口响应的字段名称为驼峰形式,而表字段名称为小写字母加下划线的形式,相互转换的处理

1、表字段名称为小写字母加下划线的形式。如图1

图1

2、接口基于 GraphQL 实现,规范为接口响应的字段名称需为驼峰形式。

type ThemeAsset
{
    "ID"
    id: ID!
    "主题ID"
    themeId: String!,
    "版本"
    version: String!,
    "内容"
    content: String,
    "路径,相对于主题的路径,如 ages/index.blade.php"
    key: String!,
    "MIME 类型"
    mimeType: String!,
    "类别,page、component、config(仅这3种类型有配置),asset、unknown"
    category: String!,
    "主题的 Schema,包括页面、主题、组件"
    schema: String,
    "创建时间"
    createdAt: DateTime!
    "更新时间"
    updatedAt: DateTime
}

3、打印解析器 /Modules/ThemeStore/Resolver/OnlineStoreTheme/ThemeAssetsResolver.php 方法中的 $themeAssets,对象属性名称为小写字母加下划线的形式。如图2

图2

<?php

namespace Modules\ThemeStore\Resolver\OnlineStoreTheme;

use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
use GraphQL\Type\Definition\ResolveInfo;
use Modules\ThemeStore\Entities\ThemeAsset;

class ThemeAssetsResolver
{
    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
    {
        $themeId = $rootValue['themeAssets']['theme_id'];

        $themeAssets = ThemeAsset::where('theme_id', $themeId)->get();

  print_r($themeAssets);
  exit;

    }
}

4、方案一为将 $themeAssets 进行 foreach 遍历,重新赋值给一个新的数组,在此数组中设置键名为驼峰形式。方案二为在 select 查询语句中重命名字段名为驼峰形式。最终决定采纳方案二。

    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
    {
        $themeId = $rootValue['themeAssets']['theme_id'];

        $themeAssets = ThemeAsset::where('theme_id', $themeId)
            ->select(
                'id',
                'theme_id as themeId',
                'version',
                'content',
                'asset_key as key',
                'mime_type as mimeType',
                'category',
                'schema',
                'created_at as createdAt',
                'updated_at as updatedAt'
            )
            ->get();

        return $themeAssets;
    }

5、请求接口,响应字段名为驼峰形式。符合预期。如图3

图3

6、查看日志中的生成的原生 SQL 语句。如图4

图4

select
  `id`,
  `theme_id` as `themeId`,
  `version`,
  `content`,
  `asset_key` as `key`,
  `mime_type` as `mimeType`,
  `category`,
  `schema`,
  `created_at` as `createdAt`,
  `updated_at` as `updated_at`
from
  `theme_asset`
where
  `theme_id` = 'vogue'
永夜