Уявіть, що ви створюєте нову функцію для свого продукту.
Нічого масштабного — просто розумніший спосіб досліджувати дані про нерухомість, щось на кшталт легкого браузера Airbnb.
А замість написання складних запитів ви хочете, щоб розробники ставили питання простою природною мовою, наприклад:
«Покажи мені апартаменти в Barcelona до $100.»
«Знайди місця в Porto з WiFi та щонайменше 2 спальнями.»
Жодного синтаксису, який треба запам’ятовувати.
Ніяких здогадок.
Просто намір → результат.
У цьому навчальному посібнику ми зробимо невеликий, але потужний проєкт, який робить саме це, використовуючи:
- Laravel 12.
- MongoDB Atlas.
- Laravel Boost для запитів у природній мові.
- AI-discoverable helper methods, які стають частиною вашої предметної області.
Замість списку розділених кроків ми побудуємо цей проєкт як наратив, де кожен крок природно виникає з потреб попереднього.
Починаємо.
# What we’re building
Наша мета — створити Airbnb Explorer, невеликий модуль для Laravel, який вміє:
- Отримувати реальні дані про нерухомість із набору даних MongoDB sample_airbnb.
- Відповідати на запитання в природній мові за допомогою Laravel Boost.
- Генерувати інсайти за допомогою MongoDB aggregations.
- Надавати повторно використовувані, AI-discoverable domain helpers.
- Підтримувати сучасний робочий процес, орієнтований на наміри.
Це не буде «ще один CRUD».
Це поступовий шлях від ідеї → використання → абстракція → інсайт.
# Why MongoDB for this project?
Перш ніж занурюватися в код, варто пояснити, чому MongoDB підходить для такого дослідницького, AI-асистованого застосунку.
# 1. Flexible document schema
Кожен запис у наборі sample_airbnb містить багато полів:
- Вкладені об'єкти (наприклад address)
- Масиви (наприклад amenities)
- Необов’язкові поля
- Різна структура між документами
Документна модель MongoDB дозволяє природно зберігати й запитувати такі структури без міграцій чи жорсткої схеми.
Для дослідницької розробки й AI-згенерованих запитів ця гнучкість дуже корисна.
# 2. Rich query capabilities
MongoDB пропонує:
- Потужну фільтрацію.
- Геопросторові запити.
- Повні aggregation pipelines.
- Фасетну аналітику.
- Запити по масивах.
- Гнучке індексування.
Це природно відповідає типовим завданням пошуку нерухомості, особливо коли результати формуються динамічною користувацькою наміром або AI-обмеженнями.
# 3. Built-in analytics engine (aggregation framework)
MongoDB aggregation pipeline дозволяє отримувати інсайти, наприклад:
- Середня ціна за типом нерухомості.
- Розподіл кількості спалень.
- Найпопулярніші amenities.
Усе всередині бази даних — без додаткового шару аналітики.
# What is Laravel Boost?
Laravel Boost — це нова функція Laravel, що приносить розробку в природній мові у ваш робочий процес.
Вона складається з трьох частин:
# 1. The Boost assistant (IDE integration)
Це бічна панель в популярних редакторах, як-от VS Code, PHPStorm, Sublime Text і Cursor.
Вона надає:
- Запити у природній мові.
- Генерацію коду.
- Розуміння проєкту.
- Виконання PHP-коду в ізольованому середовищі.
- Пояснення та допомогу з рефакторингом.
Це основний інтерфейс, через який розробники «спілкуються» з проєктом.
# 2. The Boost engine (inside your Laravel project)
Коли ви вмикаєте Boost у проєкті, Laravel додає:
- Метадані файли.
- Підказки про структуру.
- Визначення контексту.
- Механізми безпечного виконання коду.
Boost використовує це, щоб зрозуміти моделі, методи й структуру вашого проєкту.
# 3. AI-discoverable methods
Boost здатен відкривати методи вашої моделі через:
- Конвенції в іменах.
- PHPDoc-коментарі.
- Приклади.
- Типи параметрів.
Це робить вашу доменну логіку «живою» — AI природно звертається до хелперів, які ви визначаєте.
# Installing Laravel Boost
Щоб використовувати Boost у проєкті, його вмикають під час створення проєкту.
Laravel надає прапорець:
laravel new airbnb-explorer --boost
Це:
- Скелює файли метаданих Boost.
- Налаштовує проєкт для AI-підтримки.
- Дозволяє розширенню Boost в IDE одразу розуміти проєкт.
Якщо ви вже створили проєкт, Boost можна ввімкнути вручну:
php artisan boost:install
Але рекомендований спосіб — і єдиний, що розглядається в цьому посібнику — це прапорець --boost при створенні проєкту.
# Spinning up the world (setting up Laravel + MongoDB)
Почніть зі створення нового Laravel-проєкту з увімкненим Boost:
laravel new airbnb-explorer
Прапорець --boost створює необхідні файли метаданих і конфігурації, які дозволяють Laravel Boost зрозуміти структуру проєкту та виконувати інструкції на природній мові.
На боці MongoDB створіть безкоштовний кластер M0 в Atlas і завантажте набір даних sample_airbnb, який містить понад 5 000 реальних оголошень.
Цей набір даних стане «світом», який потім досліджуватиме ваш AI-асистент.
# Connecting the dots: Laravel ↔ MongoDB
Встановіть PHP-розширення MongoDB і пакет Laravel MongoDB:
pecl install mongodb
composer require mongodb/laravel-mongodb
Додайте підключення до .env:
MONGODB_URI="mongodb+srv://<user>:<pass>@cluster.mongodb.net"
MONGODB_DATABASE="sample_airbnb"
DB_CONNECTION=mongodb
Потім перевірте з’єднання:
DB::connection('mongodb')->getCollection('listingsAndReviews')->countDocuments();
Якщо ви побачите щось на кшталт 5555, ваш світ офіційно підключений.
# Giving shape to the data (creating the model)
Тепер Laravel має спосіб «думати» про вашу колекцію MongoDB.
Створіть модель:
php artisan make:model ListingAndReviews
Потім налаштуйте її:
use MongoDB\Laravel\Eloquent\Model;
class ListingAndReviews extends Model
{
protected $connection = 'mongodb';
protected $collection = 'listingsAndReviews';
protected $fillable = [
'name', 'summary', 'property_type', 'bedrooms', 'beds',
'bathrooms', 'price', 'address', 'amenities'
];
protected $casts = [
'bedrooms' => 'integer',
'bathrooms' => 'decimal:1',
'price' => 'decimal:2',
];
}
Спробуйте в Tinker:
ListingAndReviews::first()->name;
Якщо побачите щось на кшталт "Ribeira Charming Duplex", модель працює.
# Talking to your data for the first time (using Boost)
Ось і чарівний момент.
Відкрийте редактор із увімкненим Boost і скажіть:
«Using the ListingAndReviews model, show me 5 listings in Barcelona.»
Boost:
- Читає структуру проєкту.
- Виявляє вашу модель.
- Генерує правильний код.
- Виконує його.
- Повертає реальні дані.
Наприклад:
ListingAndReviews::where('address.market', 'Barcelona')
->limit(5)
->get();
Ви щойно виконали запит до MongoDB, використовуючи природну мову.
Але після кількох подібних запитів ви помічаєте, що виникають шаблони…
# Extracting patterns into AI-friendly helper methods
Більшість запитів мають однакову структуру:
- Вибір міста.
- Застосування фільтрів (ціна, спальні, тип нерухомості).
- Обмеження кількості результатів.
Замість повторення — і щоб допомогти Boost зрозуміти вашу домену — ви винесете логіку в метод:
/**
* Get listings from a specific city with optional filters.
*
* @param string $city
* @param array $filters Optional:
* - propertyType
* - minBedrooms
* - maxPrice
* - limit
*
* @example ListingAndReviews::byCity("Porto")
* @example ListingAndReviews::byCity("Barcelona", ["limit" => 5])
*/
public static function byCity(string $city, array $filters = [])
{
$query = static::where('address.market', $city);
if (isset($filters['propertyType']))
$query->where('property_type', $filters['propertyType']);
if (isset($filters['minBedrooms']))
$query->where('bedrooms', '>=', $filters['minBedrooms']);
if (isset($filters['maxPrice']))
$query->where('price', '<=', $filters['maxPrice']);
return $query
->limit($filters['limit'] ?? 10)
->get(['_id', 'name', 'price', 'bedrooms', 'property_type', 'address']);
}
Тепер введіть:
«Show me apartments in Porto under 80 dollars.»
Boost автоматично використає ваш метод:
ListingAndReviews::byCity("Porto", [
"propertyType" => "Apartment",
"maxPrice" => 80,
]);
Ви вже не просто робите запити.
Ви вчите AI вашій доменній мові.
# Turning queries into insights (analytics with aggregation)
Після дослідження оголошень наступне природне питання:
«Які інсайти я можу витягти?»
MongoDB блискуче підходить для аналітики через aggregation framework.
Створіть перший аналітичний хелпер:
/**
* Get price stats grouped by property type.
*
* @example ListingAndReviews::priceStatsByType()
* @example ListingAndReviews::priceStatsByType("Porto")
*/
public static function priceStatsByType(?string $city = null)
{
$pipeline = [];
if ($city) {
$pipeline[] = ['$match' => ['address.market' => $city]];
}
$pipeline[] = [
'$group' => [
'_id' => '$property_type',
'averagePrice' => ['$avg' => '$price'],
'count' => ['$sum' => 1],
'minPrice' => ['$min' => '$price'],
'maxPrice' => ['$max' => '$price'],
]
];
return DB::connection('mongodb')
->collection('listingsAndReviews')
->aggregate($pipeline)
->toArray();
}
Тепер Boost зможе відповідати на питання типу:
«Яка середня ціна за типом нерухомості в Barcelona?»
І він обиратиме ваш хелпер у першу чергу.
# Teaching the AI what your domain means
Boost навчається з ваших:
- Імен методів.
- PHPDoc-коментарів.
- Структур параметрів.
- Прикладів.
Коли ви створюєте методи на кшталт…
public static function affordable(string $city, float $maxPrice = 75)
…Boost починає розуміти:
- «Affordable» = ціна нижче порогу.
- Цей метод — переважний шлях для бюджетних запитів.
Отже, підказки на кшталт…
«Find budget-friendly places in Porto.»
…коректно зіставлятимуться з вашим хелпером.
Boost не просто здогадується — він навчається.
# Supercharging performance with indexes
Зі зростанням запитів зростає й потреба в продуктивності.
Створіть індекси:
$collection->createIndex(['address.market' => 1]);
$collection->createIndex(['price' => 1]);
$collection->createIndex(['address.market' => 1, 'price' => 1]);
Запустіть знову:
"Show me affordable apartments in Porto"
Тепер виконання відбувається значно швидше, часто на порядок.
AI + оптимізовані структури даних = сучасна розробка.
# Giving your work a safety net (tests)
Ваші методи тепер формують невелике внутрішнє API.
Тести фіксують очікувану поведінку:
public function test_by_city_filters_correctly()
{
$listings = ListingAndReviews::byCity("Barcelona", [
"propertyType" => "Apartment",
"maxPrice" => 100,
]);
$this->assertNotEmpty($listings);
$this->assertTrue($listings->every(fn($l) =>
$l->property_type === "Apartment" &
$l->price <= 100
));
}
Тести також допомагають Boost. Вони:
- Прояснюють семантику.
- Зменшують неоднозначність.
- Підсилюють правила домену.
Ви створили сигнали коректності для людей і для AI.
# A developer workflow powered by AI
На цей момент у вас є:
- Доменні хелпери специфічні для завдань.
- Аналітика, побудована на aggregation.
- Розробка у природній мові через Boost.
- Швидкі запити завдяки індексам.
- Стабільність через тести.
Ваш робочий процес виглядає так:
Developer Intent → AI Understanding → Helper Method → Query → Insight
Ви не пишете запити до бази вручну.
Ви формулюєте цілі — і Boost перетворює їх на код.
Це розробка, керована наміром, а не синтаксисом.
# Common pitfalls and how to avoid them
Працюючи з Laravel + MongoDB + Boost, розробники часто стикаються з кількома проблемами. Ось найпоширеніші — і як їх швидко виправити.
# 1. “Connection timeout” or “Could not connect to MongoDB Atlas”
Зазвичай це трапляється через те, що кластер блокує запит.
# ✔ Fix: Add your IP to the Atlas network access list
В MongoDB Atlas:
Security → Network Access → Add IP Address
Для девелопменту більшість використовують:
0.0.0.0/0 (allow all)
Але ви також можете додати свою конкретну IP-адресу.
Якщо ви користуєтесь VPN або корпоративним Wi‑Fi, IP може змінюватися — оновлюйте whitelist відповідно.
# 2. Forgetting to install the MongoDB PHP extension
Laravel не підключиться до MongoDB без встановленого PHP-розширення.
Типові симптоми:
- “Class MongoDB\Client not found”
- “Call to undefined function MongoDB\Driver\Manager()”
- pecl не встановлений
# ✔ Fix: Install the extension
macOS:pecl install mongodb
Ubuntu:sudo apt install php-mongodb
Windows:Download the extension matching your PHP version and add to php.ini:extension=mongodb
Не забудьте перезапустити веб‑сервер або PHP‑FPM.
# 3. Not using the correct Laravel MongoDB driver
Laravel не має вбудованої підтримки MongoDB за замовчуванням.
Якщо ви забули встановити пакет…
composer require mongodb/laravel-mongodb
…ви побачите помилки на кшталт:
- “Database type mongodb not supported.”
- “Call to undefined method connection() on driver ‘mongodb.’”
# 4. Missing or misconfigured ENV variables
Типові помилки:
- Невірний connection string
- Відсутні username/password
- Використання неправильного імені бази
- Спеціальні символи в паролі не закодовані в URL
# ✔ Fix: Verify
# .env
Приклад робочої конфігурації:
MONGODB_URI="mongodb+srv://username:password@cluster123.mongodb.net"
MONGODB_DATABASE="sample_airbnb"
DB_CONNECTION=mongodb
# 5. AI not discovering your helper methods
Симптоми:
- Boost продовжує генерувати сирі запити замість виклику вашого хелпера.
- Boost ігнорує методи вашої доменної області.
- Boost неправильно інтерпретує параметри.
# ✔ Fix: Add precise PHPDoc + examples
Boost сильно покладається на:
- Чіткі імена параметрів.
- Чисті сигнатури методів.
- Пояснення в PHPDoc.
- Приклади використання.
- Послідовне іменування.
Приклад:
/**
* Get affordable listings in a city.
*
* @example ListingAndReviews::affordable("Porto", 75)
*/
Коли документація чітка, Boost надійно обиратиме ваш хелпер у першу чергу.
# 6. Tinker execution errors when using Boost
Іноді Boost виконує код, який у Tinker падає, бо:
- Модель не була імпортована.
- MongoDB-драйвер не завантажився.
- Запит посилається на відсутнє поле.
# ✔ Fix: Preface your commands with model imports
use App\Models\ListingAndReviews;
І завжди перевіряйте фактичні імена полів у вашому наборі даних.
# Conclusion: Building smarter with Laravel + MongoDB + AI
Під час цієї подорожі ви створили більше, ніж просто приклад. Ви:
- Підключили Laravel до MongoDB Atlas.
- Досліджували дані через природну мову.
- Створили AI-discoverable helper methods.
- Побудували інсайти за допомогою aggregations.
- Оптимізували продуктивність індексами.
- Забезпечили стабільність тестами.
- Навчили AI, як працює ваша доменна область.
Laravel додає елегантності.
MongoDB дає гнучкість.
Boost приносить інтелект.
Разом вони відкривають новий тип робочого процесу.