Вступ до MongoDB та налаштування Laravel з MongoDB

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 25 вересня, 2025
Ви коли-небудь задумувалися, чому MongoDB стає все популярнішим у поєднанні з Laravel? У цій статті ви дізнаєтеся, як легка інтеграція MongoDB з Laravel забезпечує більшу гнучкість у моделюванні даних, створюючи потужний додаток блогу з функціоналом CRUD

Наприкінці цього посібника ви зможете:

# Що таке MongoDB?

MongoDB — це NoSQL (не лише SQL) база даних, яка зберігає дані у вигляді документів. Документ — це структура даних, що зберігає пари "властивість-значення", схоже на об'єкти JSON. Це робить MongoDB надзвичайно гнучкою для:

# Чому варто вибрати MongoDB замість традиційного SQL?

Що може надати NoSQL, чого немає в традиційному SQL?

Основні переваги:

> Приклад з реального життя: У нашому блоці для розробників ми можемо зберігати різні типи контенту (пости, статті, навчальні посібники) в одній колекції, при цьому зберігаючи різні схеми для кожного типу — це вимагало б кількох таблиць та складних JOIN-ів у SQL.

# Laravel + MongoDB = ✨

# Потреби

Перед початком переконайтеся, що у вас є:

Ось так просто можна почати!

Щоб уявити, що ми будемо створювати, ось демонстраційне відео:

# Налаштування проекту

# Крок 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, який демонструє:

# Наступні кроки

Готові покращити свої навички з MongoDB + Laravel? Розгляньте можливість дослідження:

  1. MongoDB Atlas для хмарного розгортання.
  2. Конвеєри агрегації для складного аналізу даних.
  3. Транзакції MongoDB для консистентності даних.
  4. Пошук повного тексту з текстовими індексами MongoDB.

# Додаткові ресурси

# Повний проект

Повний вихідний код для цього уроку доступний на GitHub.


# Часті запитання

Q: Я отримую "zsh: command not found: laravel".

A: Перейдіть на Stack Overflow за порадою!

Q: Є проблеми з підключенням до MongoDB?

A: Дізнайтеся більше про налаштування запису в списку доступу IP.

Q: Як додати більше полів до моїх моделей пізніше?

A: Просто додайте назви полів до масиву $fillable у вашій моделі. Безсхемна природа MongoDB означає, що міграцій не потрібно!


Сподіваємося, цей посібник допоможе вам зрозуміти силу та гнучкість поєднання Laravel з MongoDB. Щасливого кодування!