Symfony3 Отношения ManyToMany и каскадная стойкость. cascade = {"persist"} настроен, но возникает ошибка

Я получил ошибку при сохранении объекта, говоря, что мне нужно настроить параметр сохранения каскада в отношении ManyToMany, но он настроен.

A new entity was found through the relationship 'AppBundle\Entity\ShopProducts#shopProductImages' that was not configured to cascade persist operations for entity: AppBundle\Entity\ShopProductImages@000000007d4db89e00000000344e8db2. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade = {"persist"}). If you cannot find out which entity causes the problem implement 'AppBundle\Entity\ShopProductImages#__toString()' to get a clue.

Symfony3 Отношения ManyToMany и каскадная стойкость. cascade = {"persist"} настроен, но возникает ошибка Контроллер / ShopController.php

    $product = new ShopProducts();
    $form = $this->createForm(ProductTypeNew::class, $product);

    if ($form->isSubmitted() && $form->isValid())
    {
        $image = new ShopProductImages();
        ...
        $product->addShopProductImages($image);
        ...
        $em->persist($product);
        $em->flush();

Entity / ShopProducts.php

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(
 *     targetEntity = "AppBundle\Entity\ShopProductImages",
 *     mappedBy = "shopProducts",
 *     cascade = {"persist"}
 * )
 */
private $shopProductImages;

/**
 * @return ArrayCollection|ShopProductImages[]
 */
public function getShopProductImages()
{
    return $this->shopProductImages;
}


public function addShopProductImages(ShopProductImages $image)
{
    if ($this->shopProductImages->contains($image)) {
        return;
    }
    $this->shopProductImages[] = $image;
    $image->addImagesProduct($this);
}

public function removeShopProductImages(ShopProductImages $image)
{
    if (!$this->shopProductImages->contains($image)) {
        return;
    }
    $this->shopProductImages->removeElement($image);
    $image->removeImagesProduct($this);
}

Entity / ShopProductImages.php

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity = "AppBundle\Entity\ShopProducts",
 *     inversedBy = "shopProductImages",
 *     cascade = {"persist"}
 *     )
 * @ORM\JoinTable(name = "shop_product_images_has_shop_products"),
 *   joinColumns = {
 *     @ORM\JoinColumn(name = "shop_product_images_id", referencedColumnName = "id")
 *   },
 *   inverseJoinColumns = {
 *     @ORM\JoinColumn(name = "shop_products_id", referencedColumnName = "id")
 *   }
 */
private $shopProducts;

public function addImagesProduct(ShopProducts $product)
{
    if ($this->shopProducts->contains($product)) {
        return;
    }
    $this->shopProducts[] = $product;
    $product->addShopProductImages($this);
}

public function removeImagesProduct(ShopProducts $product)
{
    if (!$this->shopProducts->contains($product)) {
        return;
    }
    $this->shopProducts->removeElement($product);
    $product->removeShopProductImages($this);
}

Форма / Тип / ProductTypeNew.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('price')
        ->add('description', TextareaType::class)
        ->add('quantity')
        ->add('file', FileType::class, array('label' => 'Zdjęcie'))

Вы пробовали добавить $ shopProductImages = New .... (...) $ em-> persist ($ shopProductImages); в вашем контроллере

Guillaume Harari 25.04.2018 15:56

да, это в основном посте.

Sruj 25.04.2018 16:02

Я говорил о $ em-> persist ($ shopProductImages), а не о $ product. Но если это сработает, я считаю, что это плохая практика.

Guillaume Harari 25.04.2018 16:05

да, я пробовал это, тогда данные сохраняются в обеих таблицах, но не в средней таблице.

Sruj 25.04.2018 16:08

Я забыл, что это было много для многих, извините

Guillaume Harari 25.04.2018 16:09

Я думаю, ваш ансер здесь: afilina.com/doctrine-not-saving-manytomany

Guillaume Harari 25.04.2018 16:11

Попробуйте изменить "$ this-> shopProductImages [] = $ image;" в "$ this-> shopProductImages-> add ($ image);"

Jannes Botis 25.04.2018 20:29

@JannesBotis такая же ошибка после этого изменения. (спасибо за ваш вклад)

Sruj 26.04.2018 09:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
8
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На manyToMany вам не нужен cascade = {"persist"}

У вас есть add .. () и remove ... (). Он заменяет ваш каскад для сохранения данных в средней таблице.

В вашем конструкторе форм вам нужно: -> add ('ShopProductImages', 'collection', array ('by_reference' => false,))

И удалите каскады из аннотаций

Что Вы имеете в виду под «чисткой аннотаций»? удалить cascade = {"persist"}? Это не помогло

Sruj 25.04.2018 16:17

Я имел в виду именно это. Вы удалили его на обоих объектах?

Guillaume Harari 25.04.2018 16:24

в вашем конструкторе форм есть ли у вас это: -> add ('ShopProductImages', 'collection', array ('by_reference' => false,))

Guillaume Harari 25.04.2018 16:30

В своей форме я намеренно не использую сущность ShopProductImages, потому что мне нужно использовать поле FileType, потому что в форме я хочу загрузить файл.

Sruj 25.04.2018 16:35
Ответ принят как подходящий

В вашем контроллере попробуйте добавить $em->persist($image); перед промывкой.

Кажется, ваша проблема заключается в том, что он не может создать значения таблицы shop_product_images_has_shop_products, потому что у изображений еще нет идентификатора, поэтому вам нужно сохранить сущности $image и $product перед сбросом.

Кроме того, ваш cascade = {"persist"} должен быть только в аннотациях сущностей объекта изображения, а не в аннотациях продукта.

Это решает мою проблему. Идентификаторы сохраняются в средней таблице shop_product_images_has_shop_products. Я так уверен, что пробовал и это раньше.

Sruj 26.04.2018 09:41

Другие вопросы по теме