灯塔根据其他属性值更改字段值



我使用Lighthouse和Laravel 5.8来暴露某些信息。

假设我有两个表:

Order
--------
id
status

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

And my schema

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返回为null或空。

我试图使用自定义字段指令,但我不确定如果我想要它是可以实现的,因为模型还没有加载

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

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

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

有什么建议吗?

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

  • @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来代替:)

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

最新更新