Doctrine: используйте только идентификатор, чтобы установить связанный объект - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть две сущности: продукт и категория. Продукт может относиться к одной категории, поэтому между двумя объектами существует отношение 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.

Есть идеи? Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2020

Я начинаю с doctrine, поэтому я не уверен в своем ответе ^^.

Может быть, путем создания атрибута, который извлекает не полный объект, а только идентификатор?

Что-то вот так:

   /**
     * @ORM\Column(name="category_id", type="integer")
     */
    private int $categoryId;
...