РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
188 of 258 menu

Параметр 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,
    который задаёт каскадные операции для связи
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить