Salt la conținut

Tipuri de stocare

Atributele de stocare mapează proprietățile PHP pe tipuri de coloane SQL. Se pun pe fiecare proprietate a modelului.

Tipuri disponibile

AtributTip SQLTip PHP
#[Varchar(255)]VARCHAR(n)string
#[Integer]INT(11) (lățime configurabilă cu #[Integer(n)])int
#[Boolean]TINYINT(1)bool
#[Decimal(10,2)]DECIMAL(p,s) (implicit DECIMAL(10,0))BcMath\Number
#[FloatingPoint]FLOATfloat
#[Date]DATEDateTimeImmutable
#[DateTime]DATETIMEDateTimeImmutable
#[Timestamp]TIMESTAMPDateTimeImmutable
#[Time]TIMEDateTimeImmutable
#[Text]TEXTstring
#[JSON]LONGTEXTarray / mixed
#[Binary]BLOBstring
#[Enum(['val1', 'val2'])]ENUM(...)string
#[PHPSerializable]LONGTEXTmixed (serializat)
#[Other('BIGINT(20)')]Tip SQL personalizatDepinde de caz

#[Enum] vs. BackedEnum: #[Enum(['a', 'b'])] mapează proprietatea pe un string. Separat, o proprietate tipată cu un BackedEnum care nu are niciun atribut de stocare este auto-detectată ca ENUM construit din cazurile enum-ului (vezi Auto-detectare tip). Sunt două mecanisme distincte.

Exemplu

use Leto\Database\ORM\Attributes\DataStorage\Varchar;
use Leto\Database\ORM\Attributes\DataStorage\Integer;
use Leto\Database\ORM\Attributes\DataStorage\Decimal;
use Leto\Database\ORM\Attributes\DataStorage\Boolean;
use Leto\Database\ORM\Attributes\DataStorage\DateTime;
use Leto\Database\ORM\Attributes\DataStorage\JSON;
use Leto\Database\ORM\Attributes\DataStorage\Enum;
use BcMath\Number;

class Product extends Model
{
    #[Varchar(200)]
    public string $name;

    #[Decimal(10, 2)]
    public Number $price;

    #[Boolean]
    public bool $active;

    #[DateTime]
    public \DateTimeImmutable $created_at;

    #[JSON]
    public array $metadata;

    // BackedEnum-urile sunt auto-detectate: ORM-ul creează un ENUM din cazuri
    public ProductType $type;
}

#[PHPSerializable] și #[Other]

PHPSerializable

Serializare PHP pentru array-uri arbitrare. Util când ai nevoie de flexibilitate dar nu interoghezi pe conținut:

#[PHPSerializable]
public ?array $state = null;

Exemplu real: JobModel din Jobs stochează $state ca array serializat.

Other

Pentru tipuri SQL care nu sunt acoperite de atributele standard:

#[Other('BIGINT(20)')]
#[PrimaryKey, AutoIncrement]
public int $id;

Auto-detectare tip

Dacă o proprietate nu are un atribut de stocare explicit, ORM-ul încearcă să deducă tipul din tipul PHP declarat:

Tip PHPTip SQL dedus
intINT(11)
stringVARCHAR(255)
boolTINYINT(1)
floatFLOAT
BcMath\NumberDECIMAL(10,0)
DateTimeInterface (ex. DateTimeImmutable)DATETIME
BackedEnumENUM (auto-detectat din cazuri)

Exemplu real (model Student din School, care se bazează pe auto-detectare):

class Student extends Model
{
    // string -> VARCHAR(255) auto-detectat
    public ?string $surname = null;
    public ?string $name = null;

    // BackedEnum -> ENUM() cu valorile din cazuri
    public ?Gender $gender = null;

    // DateTimeImmutable -> DATETIME
    public ?\DateTimeImmutable $birth_date = null;

    // int -> INT(11)
    public int $parent_id;
}

Chiar dacă auto-detectarea acoperă multe cazuri, atributele explicite îți dau control mai fin (de exemplu #[Varchar(100)] în loc de VARCHAR(255) implicit).