<?> PHP NOVA invictum.hr
Izdanje 2026.
Poglavlje 41

Baza i Eloquent

Model baze pretvaramo u migracije i Eloquent modele, učitavamo veze bez N+1 upita i zadržavamo transakcije za povezane promjene.

31 min čitanja Srednje razina PHP 8.5 ciljna verzija

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.

Migracija articles tablice
<?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.

Eloquent model
<?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.

Eager loading i straničenje
<?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.

  1. Dodajte strane ključeve i jedinstvene indekse.
  2. Definirajte belongsTo, hasMany i belongsToMany veze.
  3. Napišite upit popisa bez N+1 problema.

Za provjeru i nastavak

Službeni izvori