2017-05-20 40 views
0

我有两个实体产品和类别与类型多对一的关联,应该我想创建一个新的产品,我已经知道它的类别(指我知道ID类)主义Symfony2的持续关联实体与现有

CLASS产品

/** 
* @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; 
} 

Class类

/** 
* @ORM\Entity 
* @ORM\Table(name="category") 
*/ 
class Category 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
} 

SCRNARIO:科瑞新产品,并认为我知道ID的类别,所以我们不需要给我们E类实体的查找方法得到它(使事情更快)

$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 \实体\产品#分类”中没有配置级联 持续操作的实体: AOBundle \实体\目录@ 0000000049a05dc500000000723a1be6。要解决 此问题:显式调用此未知实体上的EntityManager#persist()或配置级联在 映射中保留此关联,例如@ManyToOne(..,cascade = {“persist”})。如果你不能 找出哪些实体引起该问题落实 “AOBundle \实体\目录#__的toString()”,以获得一个线索。

但是当我使用find方法来获取它的工作类别实例,但我不喜欢这个解决方案我想让应用程序更快有没有任何解决方案。 感谢

+0

干净的方法是获取实体(例如使用' - > find(12)' - 我不知道为什么你会这么做以避免这种情况...你可以尝试*'$类= $ EM->合并($类);''你$分类 - > SETID(12)之后;'呼叫 – ccKep

+0

查找学说引用避免了需要实际加载的实体$类= $ EM - > getReference(12); – Cerad

回答

0

您可以使用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(); 
+0

这就是我需要的类别的对象,而不去数据库。谢谢 –

0

错误意味着,如果你坚持下去的产品,你需要使用级联,因为您尚未创建类别。

所以,你可以做这样的事情:

$em = $this->get('doctrine')->getManager(); 
$category = new Category(); 
$category->setId(12); 
$em->persist($category); 

$product = new Product(); 
$product->setName('product 1'); 
$product->setCategory($category); 
$em->persist($product); 
$em->flush(); 

我不知道为什么你设置的类别ID,但我建议你删除它

+0

ID为12类是已经在数据库中,为什么我会创造一个又一个,这是违反主要约束 –

0

也许你没有选择已有的类别。

$em = $this->get('doctrine')->getManager(); 
$category = $em->getRepository('AppBundle:Category')->find(12); 

$product = new Product(); 
$product->setName('product 1'); 
$product->setCategory($category); 

$em->persist($product); 
$em->flush(); 
+1

,你可以在我的问题,我用find方法看,我的问题是如何创建类别12的新产品,而无需调用方法查找。只需创建一个ID为12的类别并坚持产品 –

+0

我不知道这种技术,谢谢。 –

相关问题