iKatkovJS
@iKatkovJS
Symfony Developer

Doctrine — A new entity was found through the relationship. Где ошибка?

Доброго времени суток.
Есть такие сущности:
f923a4ba7ccf410591a97b65e64b90ae.png

Появилась задача создать связь "многие ко многим" между категориями и брендами. Написан вот такое консольное решение:
public function parseBrands()
    {
        $em = $this->em;
        $categories = $em->getRepository('MainCatalogBundle:Categories')->findAll();
        foreach ($categories as $category) {
            $products = $category->getProducts();
            echo $category->getId();
            foreach ($products as $iteration => $product) {
                $brand = $product->getBrand();

                if (!$brand || $category->getBrands()->contains($brand)) {
                    break;
                }

                $category->getBrands()->add($brand);
                $brand->getCategories()->add($category);

                if ($iteration % 200 === 0) {
                    $em->flush();
                    $em->clear();
                }
            }
            $em->flush();
            $em->clear();
        }
    }


При его выполнении вылазит вот такая ошибка:
[Doctrine\ORM\ORMInvalidArgumentException]
A new entity was found through the relationship 'Main\CatalogBundle\Entity\Brand#categories' that was not configured to cascade persist operations for enti
ty: Main\CatalogBundle\Entity\Categories@0000000067e0af1c0000000002662436. To solve this issue: Either explicitly call EntityManager#persist() on this unkn
own entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entit
y causes the problem implement 'Main\CatalogBundle\Entity\Categories#__toString()' to get a clue.


Добавление cascade={"persist"} в сущности не помогает. В чем проблема? Новая сущность же не создается и EntityManager автоматически начинает следить за вызываемыми сущностями, не?
  • Вопрос задан
  • 4377 просмотров
Решения вопроса 1
iKatkovJS
@iKatkovJS Автор вопроса
Symfony Developer
Переписав код таким вот образом проблема решилась
public function parseBrands()
    {
        $em = $this->em;
        for ($iteration = 2637; $iteration < 3144; $iteration += 1) {
            $category = $em->getRepository('MainCatalogBundle:Categories')->findOneBy(
                array(
                    'id' => $iteration,
                )
            );
            if ($category) {
                echo $category->getId();
                foreach ($category->getProducts() as $product) {
                    $brandId = $product->getBrand()->getId();
                    $brand = $em->getRepository('MainCatalogBundle:Brand')->findOneBy(
                        array(
                            'id' => $brandId,
                        )
                    );

                    if (!$brand || $category->getBrands()->contains($brand)) {
                        break;
                    }

                    $category->getBrands()->add($brand);
                    $brand->getCategories()->add($category);

                    $em->flush();
                }
                $em->clear();
            }
        }
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы