Если ты думаешь, что база данных «сама как-то будет работать», то будь готов к боли. 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 тут вообще ни при чём. Ошибки в базе — это не «мелочи», это бомбы замедленного действия. И чем дольше тянешь, тем громче взрыв.
0 комментариев