Как добавить динамическое предложение where в laravel, используя php lighthouse для обработки graphql
Я реализовал схему для извлечения действий из системы и очень хорошо работаю над извлечением всего списка. Я хочу начать передавать user_id, чтобы фильтровать по пользователю или фильтровать по 10 активностям на прошлой неделе. Моя схема есть;
Схема для деятельности.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
}
Как я могу добавить запрос операторов извлечения, которые имеют фильтр или где предложение, например
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, и в соответствии с проектом системы пользователи должны иметь расширенный поиск, который позволяет им выполнять пользовательскую фильтрацию, например, Не равно (!=), Не в (!), Больше (>) и т. Д. В текущей реализации у меня нет выбора но написать разные параметры фильтра для каждого расширенного поиска. Есть ли другой вариант?
0 ответов
Насколько я понимаю, у вас есть несколько вариантов.
Самый простой вариант - перейти к полнотекстовому поиску с помощью 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")
Возможно, вы захотите создать несколько перечислений для столбца и оператора, чтобы ограничить, какие операции могут использовать ваши пользователи и по каким столбцам они могут фильтровать.