У меня есть две сущности: продукт и категория. Продукт может относиться к одной категории, поэтому между двумя объектами существует отношение OneToMany:
/**
* @ORM\Entity()
*/
class Category
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Product", mappedBy="category")
*/
private $products;
public function __construct()
{
$this->products = new ArrayCollection();
}
public function getProducts(): Collection
{
return $this->products;
}
public function addProduct(Product $product): self
{
if (!$this->products->contains($product)) {
$this->products[] = $product;
$product->setCategory($this);
}
return $this;
}
public function removeProduct(Product $product): self
{
if ($this->products->contains($product)) {
$this->products->removeElement($product);
$product->setCategory(null);
}
return $this;
}
// Other methods of the class
...
}
/**
* @ORM\Entity()
*/
class Product
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
// Some properties
...
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Category", inversedBy="products")
*/
private $category;
public function getCategory(): ?Category
{
return $this->category;
}
public function setCategory(?Category $category): self
{
$this->category = $category;
return $this;
}
// Other methods of the class
...
}
При этом я могу назначать или удалять объект категории для объектов продукта, что является нормальным случаем:
// set category
$categoryId = 25;
$category = $entityManager->getRepository(Category::class)->find($categoryId);
$product->setCategory($category);
...
// remove category
$product->setCategory(null);
НО, что я хочу сделать, так это то, что в особой сложной ситуации у меня есть идентификатор категории (здесь 25), и я хотел бы установить соответствующую категорию для продукта, но без извлечение объекта Category из базы данных (потому что он находится в контексте сущности, где я не хочу использовать EntityManager).
Есть ли способ достичь чего-то вроде:
$categoryId = 25;
$product->setCategoryById($categoryId);
class Product
{
public function setCategoryById(int $categoryId): self
{
???
}
}
Это кажется возможным, потому что, в конце концов, в базе данных это просто идентификатор категории, который хранится в столбце в таблица продуктов ... но я не могу понять, как это сделать с Doctrine.
Есть идеи? Спасибо.