Nakon ovog poglavlja
Što ćete znati napraviti
- Napisati i pokrenuti reverzibilnu migraciju.
- Definirati Eloquent model, fillable polja, castove i veze.
- Prepoznati N+1 problem i primijeniti eager loading.
Shema u povijesti koda
Migracija je ponovljiva promjena baze
Migracije putuju s kodom i izvršavaju se redom. up uvodi promjenu, down je vraća gdje je sigurno. Na produkciji destruktivne promjene razdvajamo u kompatibilne korake: prvo dodamo novo, zatim prebacimo kod i podatke, a staro uklonimo u kasnijem izdanju.
<?php
Schema::create('articles', function (Blueprint $table): void {
$table->id();
$table->foreignId('user_id')->constrained()->restrictOnDelete();
$table->string('title', 200);
$table->string('slug')->unique();
$table->text('body');
$table->string('status')->index();
$table->timestamp('published_at')->nullable()->index();
$table->timestamps();
});
Objekt nad retkom
Eloquent opisuje podatke i odnose
Mass assignment dopuštamo samo kroz $fillable ili pažljivo $guarded pravilo. Cast pretvara stupac u datum, bool, array ili enum. Veze poput belongsTo i hasMany omogućuju izražajne upite, ali autorizacija i poslovna pravila i dalje trebaju jasnu granicu.
<?php
final class Article extends Model
{
protected $fillable = ['title', 'slug', 'body', 'status'];
protected function casts(): array
{
return [
'status' => ArticleStatus::class,
'published_at' => 'immutable_datetime',
];
}
public function author(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
}
Vidljiva cijena apstrakcije
Eager loading smanjuje broj upita
Ako u petlji pristupimo $article->author bez prethodnog učitavanja, svaki članak može pokrenuti novi upit. with učitava relaciju u predvidivom malom broju upita. U razvoju možemo zabraniti lazy loading kako bi se N+1 otkrio rano.
Za više povezanih promjena koristimo DB::transaction. Zaključavanje i indekse i dalje razumijemo na razini baze; ORM ih ne uklanja.
<?php
$articles = Article::query()
->with('author:id,name')
->where('status', ArticleStatus::Published)
->latest('published_at')
->paginate(20);
Primijenite naučeno
Vježba: Članci, kategorije i oznake
Prenesite model završnog projekta u Laravel migracije i modele.
- Dodajte strane ključeve i jedinstvene indekse.
- Definirajte belongsTo, hasMany i belongsToMany veze.
- Napišite upit popisa bez N+1 problema.
Za provjeru i nastavak