Присвязка Вложенная фильтрация - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю над платформой заказа еды с Prisma, Prisma-binding и Apollo Server на сервере. Клиент может выбрать ресторан в своем районе и добавить одно или несколько блюд в свою корзину. Возможно, что когда ди sh из ресторана x уже добавлен, клиент решает сделать заказ из другого ресторана, ресторана y. Поэтому мне нужно отфильтровать добавленные блюда при оформлении заказа на основе идентификатора клиента и окончательно выбранного ресторана в бэкэнде, прежде чем создавать заказ и URL-адрес платежа.

В моей призме три типа данных модель данных: Customer, CartItem и Di sh

type Customer {
    id: ID! @id
    createdAt: DateTime! @createdAt
    updatedAt: DateTime! @updatedAt
    name: String
    email: String
    phone: String
    user: User
    cart: [CartItem]!
    orders: [Order]!
}

type CartItem {
    id: ID! @id
    quantity: Int! @default(value: 1)
    dish: Dish!
    customer: Customer! @relation(link: INLINE)
}

type Dish {
    id: ID! @id
    name: String!
    price: String!
    description: String!
    isAvailable: Boolean! @default(value: true)
    category: String
    restaurant: Restaurant!
}

На площадке Prisma GraphQL, которая напрямую связана с базой данных, я могу отфильтровать элементы CartItems, которые мне нужны для создания заказа, следующим образом:

query {
  customer(where: { id: "ck8zwslgs00da0712cq88e3oh" } ) {
    id
    cart(where: { dish: { restaurant: { id: "ck904gwl400mz0712v0azegm3" } } }) {
      quantity
      dish {
        name
        price
        restaurant {
          id
          name
        }
      }
    }
  }
}

output:

{
  "data": {
    "customer": {
      "id": "ck8zwslgs00da0712cq88e3oh",
      "cart": [
        {
          "quantity": 2,
          "dish": {
            "name": "Nachos Plate Hawaii",
            "price": "1150",
            "restaurant": {
              "id": "ck904gwl400mz0712v0azegm3",
              "name": "Taco Bell"
            }
          }
        },
        {
          "quantity": 1,
          "dish": {
            "name": "Nachos Plate Vulcano",
            "price": "1250",
            "restaurant": {
              "id": "ck904gwl400mz0712v0azegm3",
              "name": "Taco Bell"
            }
          }
        }
      ]
    }
  }
}

Пока все хорошо, но сейчас мне нужен тот же запрос на сервере Apollo с использованием prisma-binding. Я попробовал несколько вещей, но ни одна из них не работает. Первые два возвращают ошибку "Поле \" Корзина \ "не определено типом CustomerWhereUniqueInput". Последние два просто возвращают каждый элемент CartItem без фильтра ресторана.

const data = await ctx.db.query.customer({
    where: {
        AND: [
            { 
                id: args.customerID 
            },
            {
                cart: {
                    dish : {
                        restaurant: {
                            id: args.restaurantID
                        }
                    }
                }
            }
        ]
    }
}, info);


const data = await ctx.db.query.customer({
    where: {
        id: args.customerID
        cart: {
            dish : {
                restaurant: {
                    id: args.restaurantID
                }
            }
        }
    }
}, info);


const data = await ctx.db.query.customer({
    where: {
        id: args.customerID
    },
    cart: {
        where: {
            dish : {
                restaurant: {
                    id: args.restaurantID
                }
            }
        }
    }
}, info);


const data = await ctx.db.query.customer({
    where: {
        id: args.customerID
    },
    cart: {
        dish : {
            restaurant: {
                where: {
                    id: args.restaurantID
                }
            }
        }
    }
}, info);

Может ли кто-нибудь помочь мне с правильным способом фильтрации идентификатора клиента и идентификатора ресторана?

...