2016-10-10 4 views
0

Сообщение об ошибке:Невозможно сохранить (Новый объект был найден через отношения)

«Новый объект был найден через отношения „AppBundle \ Entity \ Категория # продукты“, которые не были настроены на каскадный сохраняются операции для лица: AppBundle \ Entity \ продукт @ 00000000133d712400000000104ed306 для решения этот вопрос:. либо явно вызвать EntityManager # сохраняются() на этом неизвестного лица или настроить каскад упорствовать эту ассоциацию в отображения для примера @ManyToOne (. ., cascade = {"persist"}). Если вы не можете найти из которого сущность вызывает проблему 'AppBundle \ Entity \ Product #__ toString()', чтобы получить ключ. "

/AppBundle/Entity/Продукт

class Product 
{ 
/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\Column(type="string", length=100) 
*/ 
private $name; 

/** 
* @ORM\Column(type="decimal", scale=2) 
*/ 
private $price; 

/** 
* @ORM\Column(type="text") 
*/ 
private $description; 

/** 
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products") 
* @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
*/ 
private $category; 

/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set name 
* 
* @param string $name 
* 
* @return Product 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Set price 
* 
* @param string $price 
* 
* @return Product 
*/ 
public function setPrice($price) 
{ 
    $this->price = $price; 

    return $this; 
} 

/** 
* Get price 
* 
* @return string 
*/ 
public function getPrice() 
{ 
    return $this->price; 
} 

/** 
* Set description 
* 
* @param string $description 
* 
* @return Product 
*/ 
public function setDescription($description) 
{ 
    $this->description = $description; 

    return $this; 
} 

/** 
* Get description 
* 
* @return string 
*/ 
public function getDescription() 
{ 
    return $this->description; 
} 

/** 
* Set category 
* 
* @param \AppBundle\Entity\Category $category 
* 
* @return Product 
*/ 
public function setCategory(\AppBundle\Entity\Category $category = null) 
{ 
    $this->category = $category; 

    return $this; 
} 

/** 
* Get category 
* 
* @return \AppBundle\Entity\Category 
*/ 
public function getCategory() 
{ 
    return $this->category; 
} 
} 

/AppBundle/Entity/Категория

class Category 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
*/ 
protected $name; 

/** 
* @ORM\OneToMany(targetEntity="Product", mappedBy="category") 
*/ 
protected $products; 

public function __construct() 
{ 
    $this->products = new ArrayCollection(); 
} 


/** 
* Get id 
* 
* @return int 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set name 
* 
* @param string $name 
* 
* @return Category 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Add product 
* 
* @param \AppBundle\Entity\Product $product 
* 
* @return Category 
*/ 
public function addProduct(\AppBundle\Entity\Product $product) 
{ 
    $this->products[] = $product; 

    return $this; 
} 

/** 
* Remove product 
* 
* @param \AppBundle\Entity\Product $product 
*/ 
public function removeProduct(\AppBundle\Entity\Product $product) 
{ 
    $this->products->removeElement($product); 
} 

/** 
* Get products 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getProducts() 
{ 
    return $this->products; 
} 
} 

/AppBundle/Форма/CategoryType

class CategoryType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('name'); 
    $builder->add('products', CollectionType::class, array(
     'entry_type' => ProductType::class 
    )); 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\Category' 
    )); 
} 

public function getName() 
{ 
    return 'category'; 
} 
} 

/AppBundle/Форма/ProductType

class ProductType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('name') 
      ->add('price') 
      ->add('description'); 

} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\Product', 
    )); 
} 

public function getName() 
{ 
    return 'app_bundle_product_type'; 
} 
} 

/AppBundle/Controller/CategoryController

class CategoryController extends Controller 
{ 
/** 
* @Route("/category/new", name="category_new") 
* 
*/ 
public function newAction(Request $request) 
{ 
    $category = new Category(); 

    $product = new Product(); 
    $category->getProducts()->add($product); 

    $form = $this->createForm(CategoryType::class, $category); 

    $form->handleRequest($request); 

    if ($form->isValid() && $form->isSubmitted()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($category); 
     $em->flush(); 
    } 

    return $this->render('category/new.html.twig', array(
     'form' => $form->createView(), 
    )); 
} 
} 

/category/new.html.twig

{% extends 'base.html.twig' %} 

{% block body %} 

{{ form_start(form) }} 
{{ form_widget(form) }} 
<button type="submit" class="btn btn-primary">Save</button> 
{{ form_end(form) }} 

{% endblock %} 
+0

я подозреваю, что проблема была эта строка: '$ category-> getProducts() -> добавить ($ продукт),' почему вам это нужно? вы могли бы попытаться удалить? – Matteo

+0

Если я удалю эту строку, поля продукта также будут удалены. – ronald

+0

что вы хотите архивировать? «Создать пустой продукт для новой категории» или «создать новую категорию без продукта»? – Matteo

ответ

1

Вы должны изменить ассоциации для того, чтобы сказать доктриной сохраняться все новые продукты из категории

... 
/** 
* @ORM\OneToMany(targetEntity="Product", mappedBy="category", cascade={"persist", "remove"}) 
*/ 
protected $products; 
... 

или сохранить его вручную

... 
$em->persist($category); 
$em->persist($product); 
$em->flush(); 
... 

Также установлено категория продукта

... 
$product = new Product(); 
$product->setCategory($category); 
... 
+0

Работает, но есть проблема в поле category_id (значение NULL) таблицы продуктов вместо идентификатора категории. – ronald

+0

Категория установки для продукта, я обновил ответ –

+0

Спасибо, что .. Он работает. – ronald