【问题标题】:Lighthouse change field value based on other property valueLighthouse 根据其他属性值更改字段值
【发布时间】:2021-04-29 17:44:14
【问题描述】:

我在 Laravel 5.8 中使用 Lighthouse 来公开某些信息。

假设我有 2 张桌子:

Order
--------
id
status


Results
--------
id
result_value
order_id

还有我的架构

type Order {
  id: ID!
  status: String,
  results: [Result!]! @hasMany
}

type Result {
  id: ID!
  result_value: String,
  order_id: Order! @belongsTo
}

type Query {
   order(id: ID @eq): Order @find,
}

如果我运行下一个查询按预期工作,但是...

{
  order(id: 123) {
    status
    results {
      result_value
    }
  }
}

order.status 等于某个值时,我想要完成的是将order.results.result_value 返回为空或空。

我正在尝试使用custom field directive,但我不确定我想要的是否可以实现,因为模型尚未加载

理想情况下,自定义指令是理想的,因为这不是唯一的属性,也不是我需要隐藏的唯一关系。

我(我想我)不能使用@can,因为我的请求将使用自定义身份验证,并且无法通过基于角色的访问模型获得数据。

@where@whereConditions 和其他过滤指令不能使用,因为我不是要过滤所有数据。当另一个模型属性等于某个值时,我想隐藏一个模型属性值

关于如何解决这个问题有什么建议吗?

【问题讨论】:

    标签: laravel eloquent laravel-lighthouse


    【解决方案1】:

    所以我看到了多种解决方案。

    • @method 上的 Order 指令
    type Order {
      id: ID!
      status: String,
      results: [Result!]! @method(name: "getResults") @with(relation: "results")
    }
    

    然后在您的Order 类上处理getResults 方法中的过滤,有些像这样

    public function getResults()
        {
            return $this->results->when($this->status === 'something', function (Collection $results) {
                return $results->each(function (Result $result) {
                    $result->result_value = null;
                });
            });
        }
    
    • @method 上的 Result 指令
    type Order {
      id: ID!
      status: String,
      results: [Result!]! @hasMany
    }
    
    type Result {
      id: ID!
      result_value: String @method(name: "getResult") @with(relation: "order")
      order_id: Order! @belongsTo
    }
    

    然后在您的Result 模型中进行过滤,概率。像

        public function getResult()
        {
            if ($this->order->status === 'something') {
                return null;
            }
            
            return $this->result_value;
        }
    

    如果愿意,当然也可以通过使用属性 getter 来完成 :)

    【讨论】:

    • 对不起,我忘记了这个问题的所有内容。非常感谢您的回答@oliver-nybroe。最后我找到了一个实现更复杂的解决方案,一个自定义字段指令。但是您提出的选项要简单得多,而且效率更高。我将检查我的解决方案,看看我是否可以重新实施您的建议之一。再次感谢。
    【解决方案2】:

    有多种方法。从自定义字段解析器(简单但您必须处理分页),使用@builder 并根据您的status 以某种方式过滤。

    【讨论】:

    • 如果我是正确的,@builder 它将根据状态过滤结果。我不想隐藏结果,我想转换 1 属性并更改输出而不更改存储在数据库中的实际值。自定义字段解析器是我想要做的,但我不喜欢迭代以前的解析器并在嵌套关系时验证值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-09-30
    • 2022-07-28
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多