Для того чтобы извлечь только те магазины, которые связаны с определенной категорией, вам нужно изменить функцию `place`, чтобы она принимала ID категории в качестве аргумента и затем выполняла SQL-запрос для получения магазинов, относящихся к этой категории.
Предполагая, что у вас есть связь между таблицами `item` и `place` (например, через ID магазина) и между таблицей `item` и `categories`, вам потребуется выполнить JOIN-запрос между этими таблицами.
Вот как можно изменить функцию `place`:
1. Добавьте аргумент `category_id` в функцию `place`.
2. Выполните SQL-запрос для получения магазинов, связанных с этой категорией.
Пример кода:
```python
async def place(category_id):
# Выполняем SQL-запрос для получения магазинов, связанных с данной категорией
query = """
SELECT p.* FROM place p
JOIN item i ON p.id = i.place_id
WHERE i.category_id = ?
"""
# Здесь 'db' - это ваша связь с базой данных. Замените это на ваш способ доступа к БД.
async with db.execute(query, (category_id,)) as cursor:
all_places = await cursor.fetchall()
keyboard = InlineKeyboardBuilder()
for place in all_places:
keyboard.add(InlineKeyboardButton(text=place.name, callback_data=f'place_{place.id}'))
return keyboard.adjust(1).as_markup()
```
Не забудьте заменить `db` на вашу реальную единицу подключения к базе данных. Этот код делает следующее:
- Выполняет JOIN между таблицами `place` и `item`, чтобы получить все магазины (`place`), которые имеют привязанные товары (`item`) в заданной категории (`category_id`).
- Затем создаёт клавиатуру с кнопками для этих магазинов.
При вызове `place`, вам нужно будет передать ID категории, на которую нажали. Например, при обработке нажатия кнопки категории, вы можете получить ID категории и передать его в функцию `place`.
Пример обработки нажатия на кнопку:
```python
@dp.callback_query_handler(lambda c: c.data.startswith('category_'))
async def process_category(callback_query: CallbackQuery):
category_id = int(callback_query.data.split('_')[1])
keyboard = await place(category_id)
await callback_query.message.answer("Выберите магазин:", reply_markup=keyboard)
```
Таким образом, при нажатии на кнопку с категорией "кепки" вы получите только те магазины, которые связаны с данной категорией.