MongoDB в Laravel: Краткое руководство для начинающих

Источник: «MongoDB in Laravel: Short Guide for Beginners»
Laravel известен своим Eloquent ORM, обычно работающим с реляционными базами данных, такими как MySQL. Но что, если нужно выбрать NoSQL-решение, например MongoDB? В статье мы расскажем как начать работу с MongoDB в Laravel.

Зачем и когда нужен MongoDB

MongoDB — это NoSQL (Not only SQL) база данных, хранящая большие объёмы данных в виде JSON-подобных документов, которые могут менять структуру с течением времени.

Альтернативой являются реляционные базы данных, например MySQL — свободная система баз данных с открытым исходным кодом, хранящая данные в таблицах, содержащих строки и столбцы.

Основное отличие MongoDB от MySQL заключается в том, что вам не нужна предварительная схема структуры, и она масштабируется горизонтально.

MySQL — отличный выбор, если у вас структурированные данные и вам нужна традиционная реляционная база данных. Такие системы, как финансовые, электронная коммерция и т. д., лучше работают с MySQL.

MongoDB лучше работает с неструктурированными данными, такими как социальные сети, медиа, аналитика в реальном времени и т. д.

Установка сервера MongoDB

У MongoDB есть две серверные редакции: Community и Enterprise. Обе редакции могут быть установлены практически на любую операционную систему или используя Docker. Чтобы установить MongoDB локально, ознакомьтесь с официальной документацией по установке.

Альтернативный способ — использовать облачную версию под названием MongoDB Atlas, она небесплатна, но имеет бесплатный уровень.

Установка MongoDB в Laravel

Вот общая структура работы MongoDB с Laravel Eloquent:

Общая структура работы MongoDB с Laravel Eloquent
Общая структура работы MongoDB с Laravel Eloquent

Примечание: Помните, что PHP расширение MongoDB должно быть установлено и включено.

Чтобы использовать MongoDB в своём Laravel приложении, сначала необходимо установить официальный пакет, расширяющий API модели и построителя запросов от Eloquent.

composer require mongodb/laravel-mongodb

Далее необходимо зарегистрировать сервис провайдер MongoDB.

bootstrap/app.php:

return [
App\Providers\AppServiceProvider::class,
MongoDB\Laravel\MongoDBServiceProvider::class,
];

Необходимо создать подключение к базе данных в файле config/database.php.

Можно подключиться к развёрнутой MongoDB, указав URI подключения, также называемый строкой подключения. Более подробную информацию см. в руководстве по подключению.

config/database.php:

 return [

// ...

'connections' => [

'sqlite' => [
'driver' => 'sqlite',
'url' => env('DB_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

+ 'mongodb' => [
+ 'driver' => 'mongodb',
+ // Replace "mongodb://localhost:27017" with the actual connection string
+ 'dsn' => env('DB_DSN', 'mongodb://localhost:27017'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ ],

// ...

],

// ...

];

Наконец, нужно установить это соединение в качестве соединения по умолчанию в файле окружения.

.env:

// ...

DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project
DB_USERNAME=root
DB_PASSWORD=

// ...

Теперь можно использовать MongoDB в качестве базы данных в приложении. Есть некоторые отличия, поэтому давайте посмотрим, как использовать MongoDB.

Миграции

Хотя при использовании MongoDB миграции не нужны, вы всё равно можете их использовать, например, для добавления индекса. Чтобы использовать миграции, необходимо использовать класс Blueprint из MongoDB вместо Illuminate.

 use Illuminate\Database\Migrations\Migration;
-use Illuminate\Database\Schema\Blueprint;
+use MongoDB\Laravel\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
public function up(): void
{
Schema::create('posts', function (Blueprint $collection) {
$collection->index('title');
});
}
};

Эта миграция создаст коллекцию с названием posts и добавит индекс.

Коллекция в MongoDB — это то же самое, что и таблица в MySQL.

Более подробную информацию о Schema Builder можно найти в официальной документации.

Модели и Отношения

Каждая модель должна расширять класс Model из MongoDB.

-use Illuminate\Database\Eloquent\Model;
+use MongoDB\Laravel\Eloquent\Model;

class Post extends Model
{
// ...
}

Вы можете изменить имя коллекции, перезаписав защищённое свойство $collection.

При определении отношений и подсказки типов классы также должны быть из MongoDB.

 use MongoDB\Laravel\Eloquent\Model;
-use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use MongoDB\Laravel\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Post extends Model
{
// ...

public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
}

Например, получение первого сообщения будет выглядеть следующим образом:

\App\Models\Post::with('category')->first()->toJson()
{
"_id": "66387efc667555726d0f8f99",
"created_at": "2024-05-06T06:55:56.466000Z",
"updated_at": "2024-05-06T06:55:56.466000Z",
"title": "debitis quis dolorem",
"category_id": "66387efc667555726d0f8f98",
"category": {
"_id": "66387efc667555726d0f8f98",
"name": "non sed assumenda",
"updated_at": "2024-05-06T06:55:56.466000Z",
"created_at": "2024-05-06T06:55:56.466000Z"
}
}

Более подробную информацию можно найти в официальной документации.

Аутентификация

Во-первых, необходимо изменить расширенный класс в модели User на класс из пакета MongoDB, чтобы пользователи могли проходить аутентификацию в вашем приложении.

app/Models/User.php:

 // use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
-use Illuminate\Foundation\Auth\User as Authenticatable;
+use MongoDB\Laravel\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
// ...
}

Далее, по умолчанию Laravel использует драйвер сессии database. Если необходимо использовать базу данных в качестве драйвера сессии, необходимо создать собственный драйвер сессии. Или же измените драйвер сессии, например, на file.

.env:

// ...

SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null

// ...

MongoDB поддерживает несколько механизмов аутентификации, таких как SCRAM, X.509, AWS IAM. Для получения более подробной информации ознакомьтесь с документацией по безопасности MongoDB.

Финальные примечания

Существуют некоторые функции Laravel, не поддерживаемые MongoDB. Вы можете посмотреть полную совместимость MongoDB с функциями Laravel в официальной документации.

Помимо хранения данных, MongoDB может использоваться и для других функций, таких как очередь, кэш, блокировки и сессии. Подробнее об использовании MongoDB в приложениях Laravel можно узнать из официальной документации.

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 7.1: Атрибут MapUploadedFile

Следующая Статья

Некоторые интересные вещи из SQLite