Наприкінці цього посібника ви зможете:
- Зрозуміти основи MongoDB та її переваги над традиційними SQL базами.
- Налаштувати проект Laravel з інтеграцією MongoDB.
- Створити поліформні моделі з MongoDB.
- Розробити повноцінний блог для розробників із CRUD операціями.
- Впровадити розширені функції, такі як пошук і категоризація контенту.
# Що таке MongoDB?
MongoDB — це NoSQL (не лише SQL) база даних, яка зберігає дані у вигляді документів. Документ — це структура даних, що зберігає пари "властивість-значення", схоже на об'єкти JSON. Це робить MongoDB надзвичайно гнучкою для:
- Динамічних схем даних, придатних для поліформізму.
- Локалізації даних — «дані, які використовуються разом, мають бути збережені разом».
- Високої продуктивності з форматом зберігання BSON (бінарний JSON).
# Чому варто вибрати MongoDB замість традиційного SQL?
Що може надати NoSQL, чого немає в традиційному SQL?
Основні переваги:
- Менший обсяг пам'яті: формат BSON є більш ефективним, ніж жорсткі таблиці SQL.
- Відсутність проблем з NULL значеннями: MongoDB природно обробляє рідкісні дані.
- Спрощені запити: Конвеєри агрегації замінюють складні SQL JOIN-и.
- Краща масштабованість: горизонтальне масштабування вбудоване.
> Приклад з реального життя: У нашому блоці для розробників ми можемо зберігати різні типи контенту (пости, статті, навчальні посібники) в одній колекції, при цьому зберігаючи різні схеми для кожного типу — це вимагало б кількох таблиць та складних JOIN-ів у SQL.
# Laravel + MongoDB = ✨
# Потреби
Перед початком переконайтеся, що у вас є:
- PHP 8.2+.
- Composer та Laravel CLI.
- MongoDB Atlas.
Ось так просто можна почати!
Щоб уявити, що ми будемо створювати, ось демонстраційне відео:
# Налаштування проекту
# Крок 1: Створення нового проекту Laravel
Відкрийте термінал і запустіть цю команду:
laravel new developer-blog
Ви побачите інтерактивний запит на налаштування. Оберіть ці параметри:
_ _
| | | |
| | __ _ _ __ __ ___ _____| |
| | / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V / __/ |
|______\__,_|_| \__,_| \_/ \___|_|
┌ Чи бажаєте ви встановити стартовий набір? ──────┐
│ - Без стартового набору │
────────────────────────────────┘
┌ Яку тестову фреймворк ви віддаєте перевагу? ───────┐
│ - Pest │
└───────────────────────────────┘
# Крок 2: Згенерувати ключ застосунку
Перейдіть до каталогу вашого проекту та згенеруйте ключ застосунку:
cd developer-blog
php artisan key:generate
Чому це важливо: Ключ застосунку використовується для шифрування даних сесії та іншої чутливої інформації у вашому застосунку Laravel. Дізнайтеся більше.
# Крок 3: Встановлення пакету MongoDB для Laravel
Встановіть офіційний пакет MongoDB для Laravel.
composer require mongodb/laravel-mongodb
Інформація про пакет: Цей пакет забезпечує інтеграцію MongoDB для Eloquent ORM у Laravel, дозволяючи вам використовувати знайомий синтаксис Laravel з MongoDB.
# Крок 4: Налаштування з'єднання з базою даних
Оновіть файл config/database.php, щоб включити MongoDB як стандартне з'єднання:
return [
'default' => env('DB_CONNECTION', 'mongodb'),
... 'connections' => [
...
'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('DB_URI'),
'database' => env('DB_DATABASE', 'laravel'),
],
]
]
# Крок 5: Налаштування середовища
Оновіть файл .env з даними для з'єднання з MongoDB:
DB_CONNECTION=mongodb
DB_URI="YOUR_MONGODB_URI"
DB_DATABASE="YOUR_MONGODB_DB_NAME"
# Крок 6: Запустіть свій застосунок
Запустіть сервер для розробки Laravel:
php artisan serve
Тепер ви можете отримати доступ до вашого застосунку за адресою http://127.0.0.1:8000.
# Створення моделей (поліформний дизайн)
# Розуміння архітектури
Ми створимо поліформну систему контенту, де різні типи контенту (пости, статті, навчальні посібники) мають спільні властивості, але свої специфічні поля. Це чудово демонструє гнучкість MongoDB.
# Крок 1: Створення базової моделі контенту
Створіть абстрактну базову модель, від якої успадковуватимуть усі типи контенту:
Файл: app/Models/Content.php
<?php
namespace App\\Models;
use MongoDB\\Laravel\\Eloquent\\Model;
abstract class Content extends Model
{
protected $connection = 'mongodb'; // Використовуємо з'єднання MongoDB
protected $collection = 'contents'; // Одна колекція для всіх типів
protected $casts = [
'tags' => 'array', // MongoDB обробляє масиви нативно!
];
public function scopePublished($query)
{
return $query->where('status', 'published');
}
abstract public function getContentType();
}
Ключові концепції: Ви можете зберігати всі типи контенту в одній колекції з різними схемами.
# Крок 2: Створення моделей типу контенту
Використовуючи абстрактну базову модель, тепер можемо створювати моделі з різними типами та атрибутами.
Файл: app/Models/Article.php
<?php
namespace App\\Models;
class Article extends Content
{
protected $attributes = ['type' => 'article'];
// Польові специфіки статті
protected $fillable = [..., 'category', 'featured_image', 'seo_title'];
public function getContentType()
{
return 'article';
}
//Автоматичне SEO підбору
public function getSeoTitleAttribute($value)
{
return $value ?: $this->title;
}
}
Файл: app/Models/Tutorial.php
<?php
namespace App\\Models;
class Tutorial extends Content
{
protected $attributes = ['type' => 'tutorial'];
protected $casts = [
'prerequisites' => 'array', // MongoDB обробляє вкладені масиви
'steps' => 'array',
];
public function scopeByDifficulty($query, $level)
{
return $query->where('difficulty_level', $level);
}
}
Швидка порада: Ви також можете генерувати файли моделей за допомогою команди Artisan Laravel:
php artisan make:model Post
# Заповнення бази даних (опціонально, але рекомендовано)
Давайте створимо зразкові дані для роботи під час розробки. Це допоможе вам одразу побачити застосунок в дії.
# Крок 1: Створення сідіру
Файл: database/seeders/BlogContentSeeder.php
<?php
namespace Database\\Seeders;
use App\\Models\\Post;
use App\\Models\\Article;
use App\\Models\\Tutorial;
class BlogContentSeeder extends Seeder
{
public function run()
{
// Створення зразкових постів
Post::create([
'title' => 'Початок роботи з MongoDB у Laravel',
'tags' => ['mongodb', 'laravel', 'nosql'],
'status' => 'published',
'author_name' => 'John Doe',
]);
// Створення зразкового навчального посібника з полями масиву
Tutorial::create([
'title' => 'Посібник з налаштування MongoDB',
'difficulty_level' => 'beginner',
'prerequisites' => ['Основи PHP', 'Основи Laravel'],
'steps' => [
['title' => 'Встановлення MongoDB', 'content' => 'Завантажте та встановіть...'],
['title' => 'Налаштування Laravel', 'content' => 'Оновіть файли конфігурації...']
]
]);
}
}
# Крок 2: Запустіть сідіру
php artisan db:seed --class=BlogContentSeeder
Порада: Генеруйте файли сідірів, використовуючи:
php artisan make:seeder BlogContentSeeder
# Створення контролерів
Контролери обробляють бізнес-логіку та зв'язують ваші моделі з виглядом. Давайте створимо контролери, які демонструють потужні можливості запитів MongoDB.
# Основні методи контролера
Файл: app/Http/Controllers/BlogController.php
<?php
namespace App\Http\Controllers;
use App\Models\{Post, Article, Tutorial};
class BlogController extends Controller
{
public function index()
{
// Отримуємо всі типи контенту та об'єднуємо їх
$posts = Post::published()->get();
$articles = Article::published()->get();
$tutorials = Tutorial::published()->get();
$content = collect()
->merge($posts)
->merge($articles)
->merge($tutorials)
->sortByDesc('published_at');
return view('blog.index', compact('content'));
}
public function show($type, $id)
{
// Динамічне визначення моделі за типом
$content = match ($type) {
'post' => Post::findOrFail($id),
'article' => Article::findOrFail($id),
'tutorial' => Tutorial::findOrFail($id),
default => abort(404)
};
return view('blog.show', compact('content'));
}
public function search(Request $request)
{
$query = $request->get('q');
// Гнучкий текстовий пошук MongoDB через кілька полів
$searchClosure = function($q) use ($query) {
$q->where('title', 'like', "%{$query}%")
->orWhere('body', 'like', "%{$query}%")
->orWhere('tags', 'in', [$query]); // Пошук за масивним полем
};
$posts = Post::published()->where($searchClosure)->get();
// ... повторити для інших типів
}
}
# Реєстрація маршрутів
Файл: routes/web.php
<?php
use App\Http\Controllers\BlogController;
Route::prefix('blog')->name('blog.')->group(function() {
Route::get('/', [BlogController::class, 'index'])->name('index');
Route::get('/search', [BlogController::class, 'search'])->name('search');
Route::get('/{type}/{id}', [BlogController::class, 'show'])
->name('show')
->where('type', 'post|article|tutorial');
});
А для розробки інтерфейсу користувача просто працюйте з файлами blade.php після завершення логіки.
# Розширені можливості MongoDB
# Робота з масивами та вкладеними документами
MongoDB успішно обробляє складні структури даних:
// Запит масивних полів
$tutorials = Tutorial::where('tags', 'in', ['beginner', 'mongodb'])->get();
// Приклад конвеєра агрегації
$tagStats = Tutorial::raw(function($collection) {
return $collection->aggregate([
['$unwind' => '$tags'],
['$group' => [
'_id' => '$tags',
'count' => ['$sum' => 1]
]],
['$sort' => ['count' => -1]]
]);
});
# Оптимізація продуктивності
Додайте індекси, щоб поліпшити продуктивність запитів:
use MongoDB\Laravel\Schema\Blueprint;
Schema::connection('mongodb')->table('contents', function (Blueprint $table) {
$table->index('type');
$table->index('status');
$table->index('tags');
$table->text(['title', 'body']); // Текстовий індекс для пошуку
});
# Висновок
Ви успішно створили повноцінний застосунок Laravel з MongoDB, який демонструє:
- Поліформне моделювання даних з використанням спільної колекції.
- Гнучкий дизайн схем, що адаптується до різних типів контенту.
- Потужні можливості запитів, включаючи пошук для масивних полів.
- Повні CRUD операції з MongoDB та Laravel.
# Наступні кроки
Готові покращити свої навички з MongoDB + Laravel? Розгляньте можливість дослідження:
- MongoDB Atlas для хмарного розгортання.
- Конвеєри агрегації для складного аналізу даних.
- Транзакції MongoDB для консистентності даних.
- Пошук повного тексту з текстовими індексами MongoDB.
# Додаткові ресурси
# Повний проект
Повний вихідний код для цього уроку доступний на GitHub.
# Часті запитання
Q: Я отримую "zsh: command not found: laravel".
A: Перейдіть на Stack Overflow за порадою!
Q: Є проблеми з підключенням до MongoDB?
A: Дізнайтеся більше про налаштування запису в списку доступу IP.
Q: Як додати більше полів до моїх моделей пізніше?
A: Просто додайте назви полів до масиву $fillable у вашій моделі. Безсхемна природа MongoDB означає, що міграцій не потрібно!
Сподіваємося, цей посібник допоможе вам зрозуміти силу та гнучкість поєднання Laravel з MongoDB. Щасливого кодування!