FreeCode.Academy

Стратегии обучения

Уроки

Технологии

Участники

Проекты

Топики

Блоги

Офис

О проекте

Запрос graphql для получения places по региону

Выполняется

Проект: Учебный проект pivo-moscow

Планируемый запуск: Дата начала: Планируемое завершение: Дата завершения:

Описание задачи

Николай, нужна твоя подсказка.

Как сюда
query places($where: PlaceWhereInput) {
places(where: $where){
id
}
}

можно запихать условия ограничить выдачу заведений только Московского региона?
ПроектЗадачаСтатусДата постановкиНачалоКонецКто создал
Учебный проект pivo-moscowЗапрос graphql для получения places по регионуВыполняется27.01.2021 17:45:2028.01.2021 00:09:3028.01.2021 01:04:37
Николай Ланец
Николай Ланец
Николай Ланец
Николай Ланец
28 янв. 2021 г., 0:24
Дима, можно вот так:

where:{ OR:[ { address_starts_with: "Москва" }, { address_starts_with: "г. Москва" }, ] }
Только имей ввиду, что здесь OR - эуто усливие на адрес (адрес такой или адрес такой). Если суммировать с другими условиями

Но это не очень точные данные, потому что честной связи Заведение-Город у тебя нет. Так что придется еще пройтись по списку заведений в Москве (там они выбираются по удаленности широта-долгота), и где адреса не соответствуют этому правилу, подправить. Но в целом, сейчас это условие выдает цифру, близкую к тем, что на карте выводится.

То есть у тебя в БД нет признака Город или Регион. Есть только координаты.

Поэтому, если такое надо делать, то надо вводить у объекта признак Город и редактировать все заведения. Но их там почти 4000. БОльшую часть можно обновить массово, накидав скрипт через яндекс-АПИ, чтобы по координатам получить ближайший город, и если он соответствует городу из списка в базе, то его назначить.

Попов Дмитрий
Попов Дмитрий
28 янв. 2021 г., 3:37
Спасибо, понял! По этому пути я в https://pivo-voronezh.ru/ пошел. Добавить сюда ещё МО и это закроет вопрос.
Кстати, в этом случае будет же работать выбор региона + статус "лучшее заведение"? Насколько я помню - выборку по координатам и этому параметру вместе сделать нельзя.
Николай Ланец
Николай Ланец
28 янв. 2021 г., 3:49
Дима, у нас нет выборки по координатам. У нас есть только сортировка по координатам. Это принципиально иной случай. Выборка отсекает (условие where), то если позволяет выбрать ограниченное количество только тех, кто отвечает условиям. Сортировка (sortBy|orderBy) только сортирует. Но эти подходы конечно же можно сортировать. То есть ты можешь сделать выборку по условию, в том числе по статусу "Лучшее заведение" и полученные записи отсортировать по координатам.
Попов Дмитрий
Попов Дмитрий
28 янв. 2021 г., 4:09
То есть берется центральная координата (например - координата центра Москвы) и сортируется по расстоянию координаты заведения от этой точки? Понял.
Но вообще действительно просится еще 2 поля: Город и Регион(на всякий случай). В целом можно и руками внестись, так как прямо вот жить не быть и сразу все равно не нужно вноситься) Плюс SQL запросами можно жизнь себе упростить/
Николай Ланец
Николай Ланец
28 янв. 2021 г., 4:19
Ну вот тогда тебе надо бэк развивать, добавлять эти поля. Создай себе задачу на это. Но пока ты это сам скорее всего не сделаешь, а мне пока некогда, к сожалению. Но пусть будет. Будет время, сделаю.
Попов Дмитрий
Попов Дмитрий
28 янв. 2021 г., 4:48
Пока не буду: все равно надо будет учиться формировать апи
Попов Дмитрий
Попов Дмитрий
14 февр. 2021 г., 6:33
Николай, приветствую!
Нужен твой совет.
Подскажи, пожалуйста, как условие запихать правильно. Запихать надо сюда:


query beers($where: BeerWhereInput, $first: Int = 3, $skip: Int) { beersConnection(where: $where, first: $first, skip: $skip) { aggregate { count } edges { node { ...beer } } } } fragment beer on Beer { id name uri image url_name places { id price Place { ...place } } } fragment place on Place { id name uri }

А условие взть отсюда:

query places($where: PlaceWhereInput) { places(where: $where){ id name address } } ----------------- {"where": { "address_contains": "Москва" } }

Николай Ланец
Николай Ланец
14 февр. 2021 г., 14:03
Дима, привет!

А зачем условие пихать сюда? Это же сам запрос с прописанными параметрами, в том числе и $where. Не надо в него пихать, надо вызывать этот запрос с передачей в него условия (в твоем случае "where": { "address_contains": "Москва" }).

Что-то мещает это сделать?
Попов Дмитрий
Попов Дмитрий
14 февр. 2021 г., 14:08
Но ведь в BeerWhereInput нет поля address_contains, на что и ругается. Вои т теряюсь, как так передать параметр в запрос)
Николай Ланец
Николай Ланец
14 февр. 2021 г., 20:37
Аа, это я затупил. У меня в плейграунде уже был запрос заведений, вот и я сбился. А оказывается тебе надо пиво...
Но и тут не сложнее. У нас же есть связь с заведениями. Соответственно, практически все запросы на них можно формировать и в связанных объектах. В данном случае такое условие:
where: { places_some: { Place:{ address_contains: "Москва" } } }
То есть пиво, у которого хотя бы одно заведение имеет в адресе "Москва".
Есть еще places_none, то есть ни одно заведение, и places_every, то есть для коготорого все заведения будут удовлетворять условию.
Попов Дмитрий
Попов Дмитрий
15 февр. 2021 г., 4:28
Понял, спасибо!! Вот как раз было не понятно, как условия "глубже" задавать.
Николай Ланец
Николай Ланец
15 февр. 2021 г., 4:29
Не за что!
Попов Дмитрий
Попов Дмитрий
28 февр. 2021 г., 8:43
Николай, нужна твоя подсказка... Опять.

Есть gql звпрос:

query beerinfo($where: BeerWhereUniqueInput!) { object: beer(where: $where) { ...beer_ } } fragment beer_ on Beer { id name image url_name uri description }
Получает id пива - возвращает что попросил.
Добавляю
places{
id
Place{
name
address
}
}

Получаю данные заведений, в которых это пиво присутствует.
А вот приладить условие

{"where":{ "id": "0127b5076bc8040f82c0f7e74", "places_some": { "Place":{ "address_contains": "Москва" } } } }
не получается, так как places_some отсутствует в BeerWhereUniqueInput ,что понятно - там вообще только id присутствует.

Вопрос: может вообще на странице пива не BeerWhereUniqueInput, а BeerWhereInput?
Николай Ланец
Николай Ланец
28 февр. 2021 г., 11:51
Можно и BeerWhereInput использовать. Только тут придется не одно пиво получать, а массив, то есть из него еще выдернуть конечную сущность.
Но в данном случае я бы поступил иначе. Если задача в том, чтобы получить именно заведения с конкретным условием внутри конкретного объекта пива, то я бы условие адреса добавил в условие получения адресов. Это в любом случае было бы логичней. Ведь если ты ищешь пиво с учетом адреса, значит и адреса тебе нужны конкретные. Схема тебе позволяет.


Ну а далее, если ты, получив данные, хочешь убедиться, что заведения нужные в нем есть, просто проверишь beer.places.length и все. Дальше решишь что делать, если заведений в нем нет.

Иначе тут делать нет смысла. Ведь у тебя четкий ID пива, так что по сути искать не надо. И не должно быть такого, что оно то есть, то нету. А то завтра добавят тебе пиво и одно заведение, где оно продается, у тебя появится страница на сайте, она проиндексируется, а потом заведение закроется и все, пиво будет отдавать 404. Это разве дело?

Попов Дмитрий
Попов Дмитрий
28 февр. 2021 г., 12:10
Спасибо!

Добавить комментарий