Symfony3 Многочисленные отношения и каскадное постоянство. cascade = {"persist"} настроен, но возникает ошибка - PullRequest
0 голосов
/ 25 апреля 2018

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

Новый объект был обнаружен в связи «AppBundle \ Entity \ ShopProducts # shopProductImages», которая не была настроена для каскадного сохранения операций для объекта: AppBundle \ Entity \ ShopProductImages @ 000000007d4db89e00000000344e8db2. Чтобы решить эту проблему: либо явно вызовите EntityManager # persist () для этого неизвестного объекта, либо настройте каскадное сохранение этой ассоциации в отображении, например @ManyToOne (.., cascade = {"persist"}). Если вы не можете выяснить, какая сущность вызывает проблему, используйте 'AppBundle \ Entity \ ShopProductImages #__ toString ()', чтобы получить подсказку.

enter image description here Контроллер / 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'))

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

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

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

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

0 голосов
/ 25 апреля 2018

На многих ToMany вам не нужен cascade = {"persist"}

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

В конструкторе форм вам необходимо: -> добавить ('ShopProductImages', 'collection', array ('by_reference' => false,))

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

...