Tipuri de stocare
Atributele de stocare mapează proprietățile PHP pe tipuri de coloane SQL. Se pun pe fiecare proprietate a modelului.
Tipuri disponibile
| Atribut | Tip SQL | Tip 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] | FLOAT | float |
#[Date] | DATE | DateTimeImmutable |
#[DateTime] | DATETIME | DateTimeImmutable |
#[Timestamp] | TIMESTAMP | DateTimeImmutable |
#[Time] | TIME | DateTimeImmutable |
#[Text] | TEXT | string |
#[JSON] | LONGTEXT | array / mixed |
#[Binary] | BLOB | string |
#[Enum(['val1', 'val2'])] | ENUM(...) | string |
#[PHPSerializable] | LONGTEXT | mixed (serializat) |
#[Other('BIGINT(20)')] | Tip SQL personalizat | Depinde de caz |
#[Enum]vs. BackedEnum:#[Enum(['a', 'b'])]mapează proprietatea pe unstring. Separat, o proprietate tipată cu unBackedEnumcare nu are niciun atribut de stocare este auto-detectată caENUMconstruit 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 PHP | Tip SQL dedus |
|---|---|
int | INT(11) |
string | VARCHAR(255) |
bool | TINYINT(1) |
float | FLOAT |
BcMath\Number | DECIMAL(10,0) |
DateTimeInterface (ex. DateTimeImmutable) | DATETIME |
BackedEnum | ENUM (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).