首页 > 解决方案 > Lighthouse 根据其他属性值更改字段值

问题描述

我正在使用带有 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.results.result_value时返回 null 或空。order.status

我正在尝试使用自定义字段指令,但我不确定我想要的是否可以实现,因为模型尚未加载

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

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

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

关于如何解决这个问题的任何建议?

标签: laraveleloquentlaravel-lighthouse

解决方案


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

  • @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 来完成 :)


推荐阅读