为了账号安全,请及时绑定邮箱和手机立即绑定

Lighthouse 找不到我的 Union 自定义类型

Lighthouse 找不到我的 Union 自定义类型

PHP
PIPIONE 2023-11-03 15:29:19
你好吗?我正在与联合斗争,我想对基于自定义类型的联合类型的自定义解析器进行一些澄清。Mi 当前架构是product.graphql 在内部导入的schema.graphqltype ProductServing {    name: String    price: Float}type ProductDish {    price: Float    calories: Int    servings: [ProductServing]}type ProductDrink {    price: Float    servings: [ProductServing]}union ProductProperties = ProductDish | ProductDrinktype Product {    id: ID!    user: User! @belongsTo    media: Media    blocks: [Block]! @belongsToMany    slug: String!    name: String!    description: String    properties: ProductProperties!    activated_at: DateTime    created_at: DateTime!    updated_at: DateTime!} 当然,仅此模式是行不通的,因为 Lighthouse 无法理解自定义类型。我为类型创建了两个类:// App\GraphQL\Typesclass ProductDish extends ObjectType{    public function __construct()    {        $config = [            "name" => "ProductDish",            "fields" => [                "__type" => Type:string(),                "price" => Type::float(),                "calories" => Type::int(),            ],        ];        parent::__construct($config);    }}class ProductDrink extends ObjectType{    public function __construct()    {        $config = [            "name" => "ProductDrink",            "fields" => [                "__type" => Type:string(),                "price" => Type::float(),            ],        ];        parent::__construct($config);    }}以及使用 __invoke 方法的 ProductProperties 的联合类这不起作用,否则我就不会在这里,看着 graphql-playground 我收到这条消息"debugMessage": "Lighthouse failed while trying to load a type: App\\GraphQL\\Types\\ProductDish\n\nMake sure the type is present in your schema definition.\n"问题是我不确定 1)这是否是正确的方法 2)为什么 lighthouse 无法加载类型。你能告诉我处理这个问题的正确方法吗?请记住ProductDish和ProductDrink不是Eloquent 模型,而是 Product 类型上产品 json 字段属性的简单“包装器”,这是一个 Eloquent 模型ProductServing也是如此,它是一个键:值对如果我删除工会,一切都会正常。我的意思是,如果 Product 类型具有分配给 ProductDish 类型或 ProductDrink 的属性,一切都会顺利进行,但我需要联合
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

我走在正确的轨道上,但我需要解决一些问题


首先,在ProductProperties文件内部,注册表需要一个简单的字符串而不是名称空间,所以我必须键入->get("ProductDish")而不是->get(ProductDish::class)然后删除__type类型中的字段,以及 graphql 模式,因为我可以在模型内部使用变异器Product并根据某些参数确定哪种类型,像这样的东西


public function getPropertisAttribute($properties) {

    

   $properties = json_decode($properties, true);


   $properties["__type"] = // .. some logic to get the right type


   return $properties;

}

一旦我有了类型,我就可以将其用回我的ProductProperties联合类中


查看完整回答
反对 回复 2023-11-03
  • 1 回答
  • 0 关注
  • 54 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信