Я получил ошибку при сохранении объекта, говоря, что мне нужно настроить параметр сохранения каскада в отношении 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.
Контроллер / 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'))
да, это в основном посте.
Я говорил о $ em-> persist ($ shopProductImages), а не о $ product. Но если это сработает, я считаю, что это плохая практика.
да, я пробовал это, тогда данные сохраняются в обеих таблицах, но не в средней таблице.
Я забыл, что это было много для многих, извините
Я думаю, ваш ансер здесь: afilina.com/doctrine-not-saving-manytomany
Попробуйте изменить "$ this-> shopProductImages [] = $ image;" в "$ this-> shopProductImages-> add ($ image);"
@JannesBotis такая же ошибка после этого изменения. (спасибо за ваш вклад)




На manyToMany вам не нужен cascade = {"persist"}
У вас есть add .. () и remove ... (). Он заменяет ваш каскад для сохранения данных в средней таблице.
В вашем конструкторе форм вам нужно: -> add ('ShopProductImages', 'collection', array ('by_reference' => false,))
И удалите каскады из аннотаций
Что Вы имеете в виду под «чисткой аннотаций»? удалить cascade = {"persist"}? Это не помогло
Я имел в виду именно это. Вы удалили его на обоих объектах?
в вашем конструкторе форм есть ли у вас это: -> add ('ShopProductImages', 'collection', array ('by_reference' => false,))
В своей форме я намеренно не использую сущность ShopProductImages, потому что мне нужно использовать поле FileType, потому что в форме я хочу загрузить файл.
В вашем контроллере попробуйте добавить $em->persist($image); перед промывкой.
Кажется, ваша проблема заключается в том, что он не может создать значения таблицы shop_product_images_has_shop_products, потому что у изображений еще нет идентификатора, поэтому вам нужно сохранить сущности $image и $product перед сбросом.
Кроме того, ваш cascade = {"persist"} должен быть только в аннотациях сущностей объекта изображения, а не в аннотациях продукта.
Это решает мою проблему. Идентификаторы сохраняются в средней таблице shop_product_images_has_shop_products. Я так уверен, что пробовал и это раньше.
Вы пробовали добавить $ shopProductImages = New .... (...) $ em-> persist ($ shopProductImages); в вашем контроллере