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

0
Перекладено ШІ
Оригінал: 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. Щасливого кодування!

Популярні

Logomark Logotype

Інтеграція Laravel Socialite з бібліотекою Google Client PHP

Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті

Logomark Logotype

Журнал аудиту в Laravel

Хочете забезпечити повну прозорість у своїх Laravel-додатках? Пакет Laravel Audit Log допоможе вам детально відстежувати всі зміни моделей Eloquent та відповідати вимогам регуляторів. Читайте далі, щоб дізнатися, як цей потужний інструмент може підвищити надійність вашого проєкту

Logomark Logotype

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!