Атрибут Embedded
Атрибут Embedded вешается на свойство
сущности и сообщает Doctrine, что это свойство
является встраиваемым объектом (embeddable).
Значения полей такого объекта хранятся в той же
таблице, что и поля основной сущности. Сам класс
встраиваемого объекта помечается атрибутом
Embeddable.
Синтаксис
#[Embedded]
Пример
Давайте создадим встраиваемый объект
Address и встроим его в сущность
User:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Embeddable]
class Address
{
#[ORM\Column(type: 'string', length: 255)]
private string $city;
#[ORM\Column(type: 'string', length: 255)]
private string $street;
}
?>
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Embedded(class: Address::class)]
private Address $address;
?>
Doctrine создаст в таблице user колонки
address_city и address_street.
Пример
Давайте зададим собственные имена колонок через
параметр columnPrefix:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Embedded(class: Address::class, columnPrefix: 'addr_')]
private Address $address;
?>
Теперь колонки будут называться addr_city
и addr_street.
Пример
Давайте прочитаем и запишем данные встраиваемого объекта в контроллере:
<?php
namespace App\Controller;
use App\Entity\Address;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class UserController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$user = new User();
$user->setAddress(new Address('abcde', 'hello'));
$em->persist($user);
$em->flush();
return new Response($user->getAddress()->getCity());
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
атрибут
Embeddable,
который помечает класс как встраиваемый объект -
атрибут
JoinColumn,
который задаёт колонку для связи -
атрибут
OneToOne,
который задаёт связь один-к-одному -
атрибут
ManyToOne,
который задаёт связь многие-к-одному