Атрибут AssociationOverride
Атрибут AssociationOverride применяется на уровне класса сущности
и позволяет переопределить настройки ассоциации, унаследованной
от родительской сущности или встроенного типа. Первым параметром
передаётся имя ассоциации name. Через параметр joinColumns
задаются новые колонки соединения, а через inversedBy и joinTable -
обратная сторона и таблица связи.
Синтаксис
#[AssociationOverride(
name: 'associationName',
joinColumns: [
new JoinColumn(name: 'column_name', referencedColumnName: 'id')
],
inversedBy: 'propertyName',
joinTable: new JoinTable(name: 'join_table_name')
)]
Пример
Давайте создадим базовую сущность Article с ассоциацией
author, а в дочерней сущности FeaturedArticle переопределим
колонку соединения:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: 'string')]
private string $title;
#[ORM\ManyToOne(targetEntity: User::class)]
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id')]
private ?User $author = null;
}
?>
Теперь переопределим ассоциацию author в дочерней сущности
FeaturedArticle, указав другую колонку соединения:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\AssociationOverride(
name: 'author',
joinColumns: [
new ORM\JoinColumn(name: 'featured_author_id', referencedColumnName: 'id')
]
)]
class FeaturedArticle extends Article
{
#[ORM\Column(type: 'boolean')]
private bool $featured = true;
}
?>
Результат выполнения кода в виде структуры таблицы:
[
'featured_article' => [
'id' => 'integer',
'title' => 'string',
'featured_author_id' => 'integer',
'featured' => 'boolean'
]
]
Пример
Давайте переопределим ассоциацию с помощью inversedBy
и joinTable для связи многие-ко-многим:
<?php
namespace App\Entity;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Tag
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: 'string')]
private string $name;
#[ORM\ManyToMany(targetEntity: Article::class, mappedBy: 'tags')]
private Collection $articles;
}
?>
Теперь переопределим ассоциацию tags в дочерней сущности
FeaturedArticle с новой таблицей соединения:
<?php
namespace App\Entity;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\AssociationOverride(
name: 'tags',
inversedBy: 'featuredArticles',
joinTable: new ORM\JoinTable(name: 'featured_article_tag')
)]
class FeaturedArticle extends Article
{
#[ORM\Column(type: 'boolean')]
private bool $featured = true;
}
?>
Результат выполнения кода в виде имени таблицы соединения:
"featured_article_tag"
Смотрите также
-
атрибут
AttributeOverride,
который переопределяет колонки полей -
атрибут
Entity,
который помечает класс как сущность -
атрибут
MappedSuperclass,
который задаёт родительский класс для наследования -
атрибут
InheritanceType,
который задаёт стратегию наследования