【问题标题】:Unable to save (A new entity was found through the relationship)无法保存(通过关系找到新实体)
【发布时间】:2016-10-10 07:51:43
【问题描述】:

错误信息:

"通过关系发现了一个新实体 'AppBundle\Entity\Category#products' 未配置为 实体的级联持久化操作: AppBundle\Entity\Product@00000000133d712400000000104ed306。解决 这个问题:要么显式调用 EntityManager#persist() 未知实体或配置级联在 映射例如 @ManyToOne(..,cascade={"persist"})。如果你不能 找出导致问题的实体实施 'AppBundle\Entity\Product#__toString()' 来获得线索。”

/AppBundle/实体/产品

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/实体/类别

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/Form/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/Form/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 %}

【问题讨论】:

  • 我怀疑问题出在这一行:$category-&gt;getProducts()-&gt;add($product); 为什么需要它?你可以尝试删除吗?
  • 如果我删除该行,产品的字段也将被删除。
  • 您要归档什么? Create an empty product for a new categorycreate a new category without a product?

标签: doctrine symfony


【解决方案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);
...

【讨论】:

  • 它工作正常,但产品表的 category_id 字段(NULL 值)而不是 Category 的 id 存在问题。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多