doctrine -- Встроенные классы (Embadded, Embeddable). Что это, как использовать

Чтобы использовать в аннотациях класс, для которого нет соответствующей в БД таблицы, используются аннотации @Embedded и @Embeddable.

Embeddable - это встраеваемый класс. Такую аннотацию дают, когда связь с классом существует, и в структуре классов следует показать это, но таблицы для одного из классов нет, а значит, связи @One-To-Many или @One-To-One использовать не получится.

Итак, вот так описываем основной класс (класс с таблицей):

namespace App\Entity;

use App\Entity\VO\PhoneNumber;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\Embedded;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ClientRepository")
 * @ORM\Table(name="client")
 */
class Client
{
    /**
     * @var int 
     * 
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="client_pkey")
     */
    private $id;

    /**
     * @var PhoneNumber
     * 
     * @Embedded(class = "App\Entity\VO\PhoneNumber", columnPrefix = "phone_")
     */
    private $phone;

    public function __construct()
    {
        $this->phoneNumber = new PhoneNumber();
    }
}

Встраеваемый класс (класс без таблицы):

namespace App\Entity\VO;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\Embeddable;

/**
 * @Embeddable
 */
class PhoneNumber
{
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $value;
}

Подробнее здесь.

Внимание! Если у вас одновременно 2 встраеваемых класса возможно возникновение ошибки.

Источники