cycle/annotated
Define Cycle ORM entities and schema using PHP 8 attributes. Annotate columns, primary keys, enums, decimals, and relationships like HasOne, HasMany, and BelongsTo, then let Cycle build the mapping from your code.
The package provides the ability to define Cycle ORM schema using PHP attributes.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Column;
#[Entity]
class User
{
#[Column(type: 'primary')]
private int $id;
#[Column(type: 'string(32)')]
private string $login;
#[Column(type: 'enum(active,disabled)')]
private string $status;
#[Column(type: 'decimal(5,5)')]
private $balance;
}
use Cycle\Annotated\Annotation\Relation\HasOne;
use Cycle\Annotated\Annotation\Entity;
#[Entity]
class User
{
// ...
#[HasOne(target: Address::class)]
public ?Address $address;
}
Note Read more about HasOne.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\HasMany;
#[Entity]
class User
{
// ...
#[HasMany(target: Post::class)]
private array $posts;
}
Note Read more about HasMany.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\BelongsTo;
#[Entity]
class Post
{
// ...
#[BelongsTo(target: User::class)]
private User $user;
}
Note Read more about BelongsTo.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\RefersTo;
use Cycle\Annotated\Annotation\Relation\HasMany;
#[Entity]
class User
{
// ...
#[RefersTo(target: Comment::class)]
private ?Comment $lastComment;
#[HasMany(target: Comment::class)]
public array $comments;
// ...
public function addComment(Comment $c): void
{
$this->lastComment = $c;
$this->comments[] = $c;
}
public function removeLastComment(): void
{
$this->lastComment = null;
}
public function getLastComment(): ?Comment
{
return $this->lastComment;
}
}
Note Read more about RefersTo.
use Cycle\Annotated\Annotation\Relation\ManyToMany;
use Cycle\Annotated\Annotation\Entity;
#[Entity]
class User
{
// ...
#[ManyToMany(target: Tag::class, through: UserTag::class)]
protected array $tags;
public function getTags(): array
{
return $this->tags;
}
public function addTag(Tag $tag): void
{
$this->tags[] = $tag;
}
public function removeTag(Tag $tag): void
{
$this->tags = array_filter($this->tags, static fn(Tag $t) => $t !== $tag);
}
}
Note Read more about ManyToMany.
use Cycle\Annotated\Annotation\Embeddable;
use Cycle\Annotated\Annotation\Column;
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\Embedded;
#[Embeddable]
class UserCredentials
{
#[Column(type: 'string(255)')]
public string $username;
#[Column(type: 'string')]
public string $password;
}
#[Entity]
class User
{
#[Column(type: 'primary')]
public int $id;
#[Embedded(target: 'UserCredentials')]
public UserCredentials $credentials;
public function __construct()
{
$this->credentials = new UserCredentials();
}
}
Note Read more about Embedded Entities.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\Morphed\BelongsToMorphed;
#[Entity]
class Image
{
// ...
#[BelongsToMorphed(taget: ImageHolderInterface::class)]
public ImageHolderInterface $imageHolder;
}
Note Read more about BelongsToMorphed.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\Morphed\MorphedHasOne;
#[Entity]
class User
{
// ...
#[MorphedHasOne(target: Image::class)]
public $image;
}
Note Read more about MorphedHasOne.
use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Relation\Morphed\MorphedHasMany;
#[Entity]
class User
{
// ...
#[MorphedHasMany(target: Image::class)]
public $images;
}
Note Read more about MorphedHasMany.
#[Entity]
#[DiscriminatorColumn(name: 'type')] // Discriminator column (required)
class Person
{
#[Column(type: 'primary', primary: true)]
protected int $id;
#[Column(type: 'string')]
protected string $name;
}
#[Entity]
#[InheritanceSingleTable]
class Employee extends Person
{
#[Column(type: 'int')]
protected int $salary;
}
#[Entity]
#[InheritanceSingleTable(value: 'foo_customer')]
class Customer extends Person
{
#[Column(type: 'json')]
protected array $preferences;
}
Note Read more about Single Table Inheritance.
#[Entity]
class Person
{
#[Column(primary: true)]
protected int $id;
#[Column()]
protected int $fooId;
#[Column(type: 'string')]
protected string $name;
}
#[Entity]
#[InheritanceJoinedTable(outerKey: 'fooId')]
class Employee extends Person
{
#[Column(type: 'int')]
protected int $salary;
}
#[Entity]
#[InheritanceJoinedTable(outerKey: 'id')]
class Customer extends Person
{
#[Column(type: 'json')]
protected array $preferences;
}
Note Read more about Joined Table Inheritance.
The MIT License (MIT). Please see LICENSE for more information. Maintained
by Spiral Scout.
How can I help you explore Laravel packages today?