Как добавить динамическое предложение where в laravel, используя php lighthouse для обработки graphql - PullRequest
0 голосов
/ 04 января 2019

Я реализовал схему для извлечения действий из системы и отлично работает над извлечением всего списка.Я хочу начать передавать 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, например,

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, и в соответствии с проектом системы пользователи должны иметь расширенный поиск, который позволяет им выполнять пользовательскую фильтрацию, например, Не равно (! =), Не в (!), Больше (>) и т. Д. В текущей реализацииУ меня нет выбора, кроме как написать разные параметры фильтра для каждого расширенного поиска.Есть ли другой вариант?

1 Ответ

0 голосов
/ 28 июня 2019

Я вижу, что у вас есть несколько вариантов.

Самый простой вариант - перейти к полнотекстовому поиску с помощью Laravel Scout, в Lighthouse это можно использовать с найденной директивой search документах здесь .

Другой вариант, который также справедливо использует директиву whereConstraints .Эта директива в основном дает вам возможность определить, где находится часть вашего запроса.Что это за метод, который вы можете использовать для различных вложенных операторов AND и OR, например

{
  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")

Возможно, вы захотите создать некоторые перечисления для столбца и оператора, чтобы ограничить, какие операции могут использовать ваши пользователи и по каким столбцам они могут фильтроваться.

...