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, fără getteri/setteri manuali.

Caracteristici cheie:

  • Modele tipate static (public int $id, public ?DateTimeImmutable $created_at)
  • Atribute declarative: #[Table], #[PrimaryKey], #[BelongsTo], #[HasMany], #[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 DateTimeImmutable, BcMath\Number, BackedEnum
  • Chei primare compuse
  • Atribute calculate pe bulk (#[Computable])
  • Hook-uri de ciclu de viață (beforeCreate, afterUpdate, etc.)

Stil vechi vs. stil nou

Dacă vii din vechiul ORM, iată diferența:

// ❌ Stil vechi
class Article extends FluxManagerModel
{
    protected static string $__table = "articles";
    protected static array $__primaryKeys = ['article_id'];
    protected static ?string $__autoIncrement = 'article_id';
    protected static ?array $__relationships = [
        'article_type' => [
            'relationship' => Model::MODEL_RELATIONSHIP_BELONGS_TO,
            'model' => ArticleType::class,
            'primary_key' => 'article_type_id',
            'foreign_key' => 'article_type_id',
        ],
    ];
    public ?int $article_id = null;
    public int $article_type_id;
}

// ✅ Stil nou (Leto ORM)
#[Table("articles")]
class Article extends Model
{
    #[PrimaryKey, AutoIncrement]
    public int $article_id;

    #[BelongsTo('article_type', ArticleType::class, 'article_type_id')]
    public int $article_type_id;
}

Mai concis, fără duplicare de câmpuri, totul într-un singur loc, autocomplete în IDE pe tipuri reale.