【问题标题】:How to add dynamic where clause in laravel using php lighthouse for graphql processing如何使用php lighthouse在laravel中添加动态where子句进行graphql处理
【发布时间】:2019-05-30 15:57:41
【问题描述】:

我已经实现了从系统中获取活动的模式,并且正在获取整个列表。我想开始传递 user_id 以便根据用户进行过滤或按上周前 10 名的活动进行过滤。我的架构是;

activity.graphql 的架构

type ActivityActivity {
 id: ID!
 activity: String!
 user: User @belongsTo
 created_at: String!
 updated_at: String
 deleted_at: String
 createdBy: User @belongsTo
 updatedBy: User @belongsTo
 deletedBy: User @belongsTo
}

extend type Mutation {

createActivityActivity(
    id: ID 
    activity: String!
    user_id: Int!
    source_type: String!
    source_id: Int!
): ActivityActivity @create(model: "Modules\\Activity\\Entities\\Activity")

updateActivityActivity(
        id: ID!  
        activity: String
        user_id: Int 
        source_type: String
        source_id: Int
): ActivityActivity @update(model: "Modules\\Activity\\Entities\\Activity")

deleteActivityActivity(id: [ID!]!): [ActivityActivity!]! @delete(model: "Modules\\Activity\\Entities\\Activity")
}

extend type Query {
    activity_activity: [ActivityActivity!]! @paginate(model: "Modules\\Activity\\Entities\\Activity")
    find_activity_activity(id: Int! @eq): ActivityActivity @find(model: "Modules\\Activity\\Entities\\Activity")
}

extend type User {
activity: [ActivityActivity!]! @hasMany
}

如何添加具有过滤器或具有 where 子句的 fetch statements 查询,例如

query {
  activity_activity(count: 10) {
     filters{user_id : 10, created_at:2019-01-01}
     data{
       activity
       created_at,
       user{name,email,created_at}
     }  

  }
}

或在查询中添加 where 子句,例如

query {
  activity_activity(count: 10) {
     where{'user_id = 10 AND created_at=2019-01-01'}
     data{
       activity
       created_at,
       user{name,email,created_at}
     }  

  }
}

更新

建议的解决方案是过滤字段如下

extend type Query {
  activity_activity(
    activity: String @where(operator: "like"),
    user_id: Int @eq 
): [ActivityActivity!]! @paginate(model: "Modules\\Activity\\Entities\\Activity")
find_activity_activity(id: Int! @eq): ActivityActivity @find(model: "Modules\\Activity\\Entities\\Activity")

}

我正在实施一个 ERP,根据系统设计,用户应该有高级搜索,允许他们执行自定义过滤,例如不等于(!=)、不在(!)、大于(>)等。在当前实施中,我别无选择,只能为每个高级搜索编写不同的过滤器参数。有其他选择吗?

【问题讨论】:

  • 建议的解决方案如下;扩展类型查询 { activity_activity(activity: String @where(operator: "like"), user_id: Int @eq ): [ActivityActivity!]! @paginate(model: "Modules\\Activity\\Entities\\Activity") find_activity_activity(id: Int!@eq): ActivityActivity @find(model: "Modules\\Activity\\Entities\\Activity") }跨度>

标签: php laravel-5 graph laravel-lighthouse


【解决方案1】:

我认为您有几个选择。

最简单的选择是使用 Laravel Scout 转换为全文搜索,在 Lighthouse 中,这可以与 docs here 中的 search 指令一起使用。

另一个选项也是公平地使用whereConstraintsdirective。该指令基本上使您可以访问定义查询的位置。你可以用不同的 AND 和 OR 语句做嵌套 where 的方法,就像这样

{
  people(
    filter: {
      where: [
        {
          AND: [
            { column: "age", operator: GT value: 37 }
            { column: "type", value: "Actor" }
            {
              OR: [
                { column: "haircolour", value: "red" }
                { column: "height", operator: GTE, value: 150 }
              ]
            }
          ]
        }
      ]
    }
  ) {
    name
  }

因此,以您的示例并使用该指令构建它看起来像这样

extend type Query {
    activity_activity(
        where: WhereConstraints @whereConstraints
    ): [ActivityActivity!]! @paginate(model: "Modules\\Activity\\Entities\\Activity")
}

input WhereConstraints {
    column: String
    operator: String = EQ
    value: Mixed
    AND: [WhereConstraints!]
    OR: [WhereConstraints!]
    NOT: [WhereConstraints!]
}

scalar Mixed @scalar(class: "MLL\\GraphQLScalars\\Mixed")

您可能希望为列和运算符创建一些枚举,以限制您的用户可以使用哪些操作以及他们可以过滤哪些列。

【讨论】:

    猜你喜欢
    • 2023-01-05
    • 2015-02-07
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多