Атрибут Embeddable
Атрибут Embeddable вешается на класс,
который не является сущностью, но содержит набор
полей для повторного использования. Такой класс
встраивается в сущность через атрибут Embedded.
Это позволяет избежать дублирования кода при
описании одинаковых полей в разных сущностях.
Синтаксис
#[Embeddable]
class Address
{
// fields
}
Пример
Давайте создадим встраиваемый класс Address
с полями для хранения адреса:
<?php
namespace AppEmbeddable;
use DoctrineORMMapping as ORM;
#[ORMEmbeddable]
class Address
{
#[ORMColumn(type: 'string', length: 255)]
private string $city;
#[ORMColumn(type: 'string', length: 255)]
private string $street;
#[ORMColumn(type: 'string', length: 20)]
private string $zip;
public function getCity(): string
{
return $this->city;
}
public function setCity(string $city): void
{
$this->city = $city;
}
public function getStreet(): string
{
return $this->street;
}
public function setStreet(string $street): void
{
$this->street = $street;
}
public function getZip(): string
{
return $this->zip;
}
public function setZip(string $zip): void
{
$this->zip = $zip;
}
}
?>
Пример
Теперь встроим класс Address в сущность
User через атрибут Embedded:
<?php
namespace AppEntity;
use AppEmbeddableAddress;
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMTable(name: 'users')]
class User
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
#[ORMEmbedded(class: Address::class)]
private Address $address;
public function getId(): int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
public function getAddress(): Address
{
return $this->address;
}
public function setAddress(Address $address): void
{
$this->address = $address;
}
}
?>
Пример
Давайте создадим объект User, заполним
встроенный адрес и выведем данные:
<?php
use AppEntityUser;
use AppEmbeddableAddress;
$address = new Address();
$address->setCity('abcde');
$address->setStreet('article');
$address->setZip('12345');
$user = new User();
$user->setName('hello');
$user->setAddress($address);
echo $user->getName() . ' - ' . $user->getAddress()->getCity();
?>
Результат выполнения кода:
"hello - abcde"
Смотрите также
-
атрибут
Embedded,
который встраивает объект в сущность -
атрибут
JoinColumn,
который задаёт колонку для связи -
атрибут
OneToOne,
который задаёт связь один-к-одному -
атрибут
ManyToOne,
который задаёт связь многие-к-одному