Salt la conținut

ORM

ORM-ul Leto este un ORM modern cu atribute PHP 8, conceput pentru productivitate maximă. Modelele sunt clase PHP pure cu proprietăți publice tipate, fără array-uri de configurare și fără getteri/setteri manuali.

Un model este o clasă care extinde Model, cu proprietăți publice tipate și atribute care descriu tabela:

use Leto\Database\ORM\Model;
use Leto\Database\ORM\Attributes\Table;
use Leto\Database\ORM\Attributes\PrimaryKey;
use Leto\Database\ORM\Attributes\AutoIncrement;
use Leto\Database\ORM\Attributes\DataStorage\Varchar;

#[Table('articles')]
class Article extends Model
{
    #[PrimaryKey, AutoIncrement]
    public int $id;

    #[Varchar(200)]
    public string $title;
}

Atât. De aici poți deja salva și interoga:

$article = new Article();
$article->title = 'Primul articol';
$article->create();

$articles = Article::where('title', 'LIKE', 'Primul%')->get();
Modelele mapează tabele care există deja în baza de date. Vezi Quickstart pentru cum apar tabelele (schema și migrările sunt gestionate de platformă, nu de ORM).

Caracteristici cheie:

  • Modele tipate static (public int $id, public ?DateTimeImmutable $created_at)
  • Atribute declarative: #[Table], #[PrimaryKey], #[BelongsTo], #[HasMany], #[HasOne], #[HasManyThrough], #[Varchar(100)]
  • Query builder fluid: Student::where('status', 'active')->orderBy('created_at', Order::DESC)->paginate(1, 20)
  • Eager loading cu with(), rezolvă N+1
  • Suport nativ pentru DateTimeInterface, BcMath\Number, BackedEnum
  • Chei primare compuse
  • Atribute calculate (#[Computable])
  • Hook-uri de ciclu de viață prin atribute PHP 8 (#[BeforeCreate], #[AfterUpdate], etc.)
  • Dirty Tracking: isDirty(), getDirty(), getOriginal() pe orice model
  • Trait-uri funcționale: HasTimestamps, HasRecompute, HasValidation, HasOrder
  • Protecție PK auto-increment: update() blochează modificarea coloanelor #[AutoIncrement]
  • Valori implicite: #[DefaultValue] și #[DefaultExpression] pentru coloane
  • Access Control (ACL): #[ACLModel], #[ACLField], handleri dinamici per instanță

Cum citești această secțiune

Paginile sunt ordonate ca un parcurs: pornește de la Modelul minimal, continuă cu atributele și tipurile de stocare, apoi operațiunile CRUD și relațiile. Hook-urile, trait-urile funcționale, atributele calculate și ACL sunt subiecte mai avansate, la final.

Vii din vechiul ORM (FluxManagerModel)? Leto înlocuiește array-urile de configurare ($__table, $__primaryKeys, $__relationships) cu atribute PHP 8 pe proprietăți tipate: aceeași definiție, mult mai concisă, într-un singur loc și cu autocomplete real în IDE.