MongoDB в Laravel — это как пытаться засунуть квадратный колышек в круглое отверстие. Оно лезет, но с хрустом. Зачем вообще связываться? Потому что бывают проекты, где MySQL или Postgres начинают задыхаться: слишком много динамики, структуры пляшут, а данные больше похожи на помойку JSON-объектов, чем на нормальные таблицы.

И вот тут появляется MongoDB. Красиво? Нет. Полезно? Иногда.

Шаг 1. MongoDB, мать её

Сначала ставишь сам MongoDB. Да, руками. Да, с их официального сайта, а не через какой-то «шаманский установщик». Потом запускаешь демона и молишься, чтобы он не отвалился после ребута.

Шаг 2. Пакет на все случаи жизни

Без jenssegers/laravel-mongodb ты далеко не уедешь. Этот пакет — костыль, который прикручивает Mongo к Eloquent.

composer require jenssegers/mongodb

Именно он позволит тебе писать в стиле «User::find()» и делать вид, что у тебя всё ещё SQL. На деле — это просто синтаксический сахар над Mongo-запросами.

Шаг 3. Настройки в .env

Тут всё по классике:

DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password

Проблемы начнутся, когда у тебя будет кластер или репликация, но это уже отдельный цирк с конями.

Шаг 4. Модель под коллекцию

Лепим модель:

php artisan make:model User

И в неё:

namespace App\Models;

use Jenssegers\Mongodb\Eloquent\Model;

class User extends Model
{
    protected $connection = 'mongodb';
    protected $collection = 'users';

    protected $fillable = ['name', 'email', 'password'];
}

Звучит красиво, но помни: никакие foreign keys тебе тут не светят. Mongo живёт без отношений, и придётся или дублировать данные, или писать костыли на уровне кода.

Шаг 5. CRUD и прочая рутина

Создание пользователя выглядит привычно:

$user = new User;
$user->name = 'John Doe';
$user->email = 'john@example.com';
$user->password = bcrypt('password');
$user->save();

Работает. Но если у тебя привычка делать join через полпроекта, забудь. Здесь тебя ждёт ад ручных связок и агрегатов.

Шаг 6. Агрегации и прочие извращения

Да, where, orderBy и take работают. Но попробуй-ка в Mongo провернуть сложную аналитику. Тут без пайплайна агрегаций не обойтись, а Eloquent для этого выглядит, мягко говоря, как хромая лошадь.

$users = User::where('votes', '>', 100)
             ->orderBy('name', 'desc')
             ->take(10)
             ->get();

Красиво? На демо-проекте — да. В продакшене ты быстро поймёшь, что проще писать чистые Mongo-запросы руками, чем ломать мозг Eloquent-адаптеру.

Итог: Mongo — это не MySQL

Использовать MongoDB в Laravel можно. Иногда нужно. Но не строй иллюзий: это не магия и не «новый уровень гибкости». Это другая философия работы с данными, и Laravel тут не то чтобы сильно помогает.

Хочешь масштабируемости и свободы структуры? Готов ковыряться с агрегациями и забыть про нормальные связи? Тогда MongoDB тебе друг.

Хочешь, чтобы всё было просто и красиво? Тогда иди обратно к MySQL и не мучай себя.