Параметр mappedBy атрибута OneToMany
Параметр mappedBy используется внутри атрибута OneToMany
для указания имени свойства в дочерней сущности, которое
описывает обратную связь. Он сообщает Doctrine, что данная
сторона связи не является владельцем, а лишь отражает
существующую связь ManyToOne на другой стороне. Значением
параметра выступает строка с именем свойства.
Синтаксис
#[OneToMany(mappedBy: 'propertyName', targetEntity: Entity::class)]
Пример
Давайте создадим сущность Category, у которой есть
множество товаров Product. На стороне категории
укажем mappedBy со значением 'category':
<?php
namespace AppEntity;
use AppRepositoryCategoryRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: CategoryRepository::class)]
class Category
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
#[ORMOneToMany(mappedBy: 'category', targetEntity: Product::class)]
private Collection $products;
public function __construct()
{
$this->products = new ArrayCollection();
}
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 getProducts(): Collection
{
return $this->products;
}
}
?>
Теперь создадим сущность Product, которая
является владельцем связи через атрибут ManyToOne:
<?php
namespace AppEntity;
use AppRepositoryProductRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ProductRepository::class)]
class Product
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
#[ORMManyToOne(targetEntity: Category::class, inversedBy: 'products')]
#[ORMJoinColumn(nullable: false)]
private ?Category $category = null;
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 getCategory(): ?Category
{
return $this->category;
}
public function setCategory(?Category $category): void
{
$this->category = $category;
}
}
?>
Пример
Давайте получим все товары категории через обратную связь:
<?php
namespace AppController;
use AppEntityCategory;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ProductController extends AbstractController
{
#[Route('/category/{id}', name: 'category_products')]
public function products(int $id, EntityManagerInterface $em): Response
{
$category = $em->getRepository(Category::class)->find($id);
$res = [];
foreach ($category->getProducts() as $product) {
$res[] = $product->getName();
}
return new Response(implode(', ', $res));
}
}
?>
Результат выполнения кода для категории с товарами:
"article, user, hello"
Смотрите также
-
атрибут
OneToMany,
который описывает связь один-ко-многим -
атрибут
ManyToOne,
который описывает связь многие-к-одному -
параметр
inversedBy,
который указывает обратное свойство для ManyToOne -
параметр
cascade,
который задаёт каскадные операции для связи