Наприкінці цього посібника ви зможете:
MongoDB — це NoSQL (не лише SQL) база даних, яка зберігає дані у вигляді документів. Документ — це структура даних, що зберігає пари "властивість-значення", схоже на об'єкти JSON. Це робить MongoDB надзвичайно гнучкою для:
Що може надати NoSQL, чого немає в традиційному SQL?
Основні переваги:
> Приклад з реального життя: У нашому блоці для розробників ми можемо зберігати різні типи контенту (пости, статті, навчальні посібники) в одній колекції, при цьому зберігаючи різні схеми для кожного типу — це вимагало б кількох таблиць та складних JOIN-ів у SQL.
Перед початком переконайтеся, що у вас є:
Ось так просто можна почати!
Щоб уявити, що ми будемо створювати, ось демонстраційне відео:
Відкрийте термінал і запустіть цю команду:
laravel new developer-blog
Ви побачите інтерактивний запит на налаштування. Оберіть ці параметри:
_ _
| | | |
| | __ _ _ __ __ ___ _____| |
| | / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V / __/ |
|______\__,_|_| \__,_| \_/ \___|_|
┌ Чи бажаєте ви встановити стартовий набір? ──────┐
│ - Без стартового набору │
────────────────────────────────┘
┌ Яку тестову фреймворк ви віддаєте перевагу? ───────┐
│ - Pest │
└───────────────────────────────┘
Перейдіть до каталогу вашого проекту та згенеруйте ключ застосунку:
cd developer-blog
php artisan key:generate
Чому це важливо: Ключ застосунку використовується для шифрування даних сесії та іншої чутливої інформації у вашому застосунку Laravel. Дізнайтеся більше.
Встановіть офіційний пакет MongoDB для Laravel.
composer require mongodb/laravel-mongodb
Інформація про пакет: Цей пакет забезпечує інтеграцію MongoDB для Eloquent ORM у Laravel, дозволяючи вам використовувати знайомий синтаксис Laravel з MongoDB.
Оновіть файл config/database.php, щоб включити MongoDB як стандартне з'єднання:
return [
'default' => env('DB_CONNECTION', 'mongodb'),
... 'connections' => [
...
'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('DB_URI'),
'database' => env('DB_DATABASE', 'laravel'),
],
]
]
Оновіть файл .env з даними для з'єднання з MongoDB:
DB_CONNECTION=mongodb
DB_URI="YOUR_MONGODB_URI"
DB_DATABASE="YOUR_MONGODB_DB_NAME"
Запустіть сервер для розробки Laravel:
php artisan serve
Тепер ви можете отримати доступ до вашого застосунку за адресою http://127.0.0.1:8000.
Ми створимо поліформну систему контенту, де різні типи контенту (пости, статті, навчальні посібники) мають спільні властивості, але свої специфічні поля. Це чудово демонструє гнучкість MongoDB.
Створіть абстрактну базову модель, від якої успадковуватимуть усі типи контенту:
Файл: 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();
}
Ключові концепції: Ви можете зберігати всі типи контенту в одній колекції з різними схемами.
Використовуючи абстрактну базову модель, тепер можемо створювати моделі з різними типами та атрибутами.
Файл: 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
Давайте створимо зразкові дані для роботи під час розробки. Це допоможе вам одразу побачити застосунок в дії.
Файл: 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' => 'Оновіть файли конфігурації...']
]
]);
}
}
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 успішно обробляє складні структури даних:
// Запит масивних полів
$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, який демонструє:
Готові покращити свої навички з MongoDB + Laravel? Розгляньте можливість дослідження:
Повний вихідний код для цього уроку доступний на GitHub.
Q: Я отримую "zsh: command not found: laravel".
A: Перейдіть на Stack Overflow за порадою!
Q: Є проблеми з підключенням до MongoDB?
A: Дізнайтеся більше про налаштування запису в списку доступу IP.
Q: Як додати більше полів до моїх моделей пізніше?
A: Просто додайте назви полів до масиву $fillable у вашій моделі. Безсхемна природа MongoDB означає, що міграцій не потрібно!
Сподіваємося, цей посібник допоможе вам зрозуміти силу та гнучкість поєднання Laravel з MongoDB. Щасливого кодування!