Если ты думаешь, что база данных «сама как-то будет работать», то будь готов к боли. Laravel помогает, но не спасает. Ошибки в структуре базы — это те самые минные поля, которые рвут приложение на проде. Ниже — список косяков, которые делают даже опытные разработчики.

Структура базы данных — это то, что потом либо тащит проект, либо делает так, что каждая миграция превращается в мини-ад. Laravel с его миграциями и Eloquent вроде как должен упрощать жизнь, но по факту многие всё равно стреляют себе в ногу. Ниже пройдёмся по классическим фейлам. Если узнаешь себя — значит, уже поздно, но ещё можно что-то починить.

1. Миграции как набор костылей

Ошибка: лепить миграции без плана. Сначала string там, где нужен text, потом менять поле через три релиза, потом добавлять «временный фикс». В итоге таблица выглядит как Frankenstein Edition.

Пример, когда хотя бы не стыдно:

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Совет: перед тем как жать php artisan migrate, подумай, что будет через полгода. Миграции — это история твоих ошибок, и её будут читать другие.

2. Нормализация? Не, не слышал

Ошибка: в одну таблицу всё подряд. И юзер, и его адреса, и настройки, и любимый цвет трусов. Потом это грузится на каждом запросе.

Пример нормального решения:

Schema::create('orders', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    $table->timestamps();
});

Если у тебя поле address1, address2, address3 в users — то поздравляю, ты построил Excel, а не базу данных.

3. Eloquent: магия, которая жрёт память

Ошибка: разработчик думает «ой, Eloquent такой удобный», и начинает тянуть всё подряд. $users = User::all(); в проекте с миллионом юзеров — классика жанра.

Правильнее: учись юзать ->with(), ->select() и ->chunk(). И не забывай писать связи:

class User extends Model
{
    public function orders()
    {
        return $this->hasMany(Order::class);
    }
}

Если связи не описал, а лепишь DB::table()->join() в каждом контроллере, то зачем тебе вообще Eloquent?

4. SQL-инъекции: «ну это же не со мной»

Ошибка: писать сырой SQL и подставлять данные от юзера. Потом на проде оказывается, что кто-то уже вытаскивает твои таблицы.

Пример, как хотя бы не стыдно:

$users = DB::table('users')->where('votes', '>', 100)->get();

Laravel и Eloquent сами экранируют данные. Но если ты пишешь:

DB::select("SELECT * FROM users WHERE email = '$email'");

— то ты не разработчик, а поставщик дампов в даркнет.

5. Индексы: «а вдруг само быстро найдётся»

Ошибка: забыть индекс на поле, по которому у тебя идут 90% запросов. Итог: запросы ползут, как улитки в клей.

Пример:

Schema::table('users', function (Blueprint $table) {
    $table->index('email');
});

Лучше добавить индекс заранее, чем потом бегать с EXPLAIN и думать, почему MySQL ест весь CPU.

6. Валидация: мусор на входе — мусор в базе

Ошибка: нет валидации данных, всё пишется как есть. В итоге у тебя в базе «имя: 123», «email: test@test» и «пароль: qwerty».

Пример хоть какой-то адекватности:

public static function boot()
{
    parent::boot();

    static::saving(function ($model) {
        $model->validate();
    });
}

Если у тебя модель принимает любой бред — готовься к тому, что твоя база превратится в помойку быстрее, чем ты напишешь «refactor».

Итог

Laravel даёт инструменты. Но если ты делаешь миграции через задницу, не ставишь индексы, не валидируешь данные и хранишь всё в одной таблице, то Laravel тут вообще ни при чём. Ошибки в базе — это не «мелочи», это бомбы замедленного действия. И чем дольше тянешь, тем громче взрыв.