Атрибут JoinColumns
Атрибут JoinColumns вешается на свойство сущности
и позволяет объединить несколько атрибутов JoinColumn
в один составной внешний ключ. Это нужно, когда связанная
сущность идентифицируется не одним полем, а несколькими.
Внутри передаётся массив атрибутов JoinColumn, каждый
из которых описывает одну колонку внешнего ключа.
Синтаксис
#[JoinColumns([
new JoinColumn(name: name, referencedColumnName: refName),
new JoinColumn(name: name2, referencedColumnName: refName2)
])]
Пример
Давайте свяжем сущность Article с сущностью User
по составному ключу из двух колонок:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title = '';
#[ORMManyToOne(targetEntity: User::class)]
#[ORMJoinColumns([
new ORMJoinColumn(
name: 'user_id',
referencedColumnName: 'id'
),
new ORMJoinColumn(
name: 'user_type',
referencedColumnName: 'type'
)
])]
private ?User $user = null;
}
?>
Пример
Теперь опишем сущность User с составным первичным ключом:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class User
{
#[ORMId]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMId]
#[ORMColumn(type: 'string', length: 50)]
private string $type;
#[ORMColumn(type: 'string', length: 255)]
private string $name = '';
public function getId(): int
{
return $this->id;
}
public function getType(): string
{
return $this->type;
}
public function getName(): string
{
return $this->name;
}
}
?>
Пример
Давайте создадим статью и привяжем её к пользователю:
<?php
namespace AppController;
use AppEntityArticle;
use AppEntityUser;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/create', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$user = new User();
$user->setId(1);
$user->setType('admin');
$user->setName('abcde');
$article = new Article();
$article->setTitle('article');
$article->setUser($user);
$em->persist($user);
$em->persist($article);
$em->flush();
return new Response('created');
}
}
?>
Результат выполнения кода:
"created"
Смотрите также
-
атрибут
JoinColumn,
который задаёт одну колонку внешнего ключа -
атрибут
ManyToOne,
который создаёт связь многие-к-одному -
параметр
name,
который задаёт имя колонки внешнего ключа -
параметр
referencedColumnName,
который задаёт имя связанной колонки