我有两个实体 Product 和 Category,关联类型为 ManyToOne,假设我想创建一个新产品并且我已经知道它的类别(意味着我知道 ID 类别)
类产品
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $category;
}
课程类别
/**
* @ORM\Entity
* @ORM\Table(name="category")
*/
class Category
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
SCRNARIO:创建新产品并假设我知道 ID 类别,所以我们不需要使用 Category Entity 的 find 方法来获取它(使事情更快)
$em = $this->get('doctrine')->getManager();
$category = new Category();
$category->setId(12);
$product = new Product();
$product->setName('product 1');
$product->setCategory($category);
$em->persist($product);
$em->flush();
上面的代码不起作用它会产生一个异常:
通过关系“AOBundle\Entity\Product#category”发现一个新实体,该实体未配置为对实体进行级联持久化操作:AOBundle\Entity\Category@0000000049a05dc500000000723a1be6。解决这个问题:要么在这个未知实体上显式调用 EntityManager#persist() 要么配置级联在映射中持久化这个关联,例如@ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行 'AOBundle\Entity\Category#__toString()' 以获取线索。
但是当我使用 find 方法获取它工作的类别实例时,但我不喜欢这个解决方案,我想让应用程序更快,是否有任何解决方案。谢谢
您可以为此使用 EntityManager 的 getReference 方法。
您的代码应如下所示。
$em = $this->get('doctrine')->getEntityManager();
$category = $em->getReference('AppBundle:Category', 12);
$product = new Product();
$product->setName('product 1');
$product->setCategory($category);
$em->persist($product);
$em->flush();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句