【发布时间】:2017-05-20 10:02:14
【问题描述】:
我有两个实体 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 方法来获取它工作的类别实例时,但我不喜欢这个解决方案,我想让应用程序更快,有什么解决方案吗? 谢谢
【问题讨论】:
-
干净的方法是获取实体(例如使用
->find(12)- 我不知道你为什么要花这么多时间来避免这种情况......你可以尝试$category = $em->merge($category);在你的$category->setId(12);电话之后。 -
Lookup Doctrine 引用避免了实际加载实体的需要。 $category = $em->getReference(12);