我正在Symfony2上构建一个API,我有一个Model ItemOrder,它与Model Item有一个ManyToOne关系。我的数据库中有一些项目,我想添加一个ItemOrder,指向已经在数据库中的项目,我知道它的ID。所以我的第一个方法就是:
$item = new Item();
$item->setId(2);
$orderItem = new OrderItem();
$orderItem->setItem($item);
$em->persist($orderItem);
$em->flush();
然而,Symfony2明白我正在尝试创建一个新项目。我知道有效的方法是使用实体管理器获取Item对象,然后将其分配给ItemOrder,但我认为这是一种不太有效的方法。
那怎么办呢?
答案 0 :(得分:3)
您要找的是Partial Reference。
$item = $em->getPartialReference('Item', 2);
$orderItem = new OrderItem();
$orderItem->setItem($item);
$em->persist($orderItem);
$em->flush();
但是,请仔细阅读What is the problem?段落,而不是通过ID查询完整实体可能更安全。
我最初也发现了被遗忘的东西,但我不认为这是正确的解决方案。
这两种方法似乎几乎相同,都在官方文档中引用。 似乎只有通过直接查看源代码才能确定哪个最佳的合理方法:getReference()和getPartialReference()。
直接你会注意到getPartialReference()
更好地记录了一个与你的用例完全匹配的用例的清晰描述:
* The use-cases for partial references involve maintaining bidirectional associations
* without loading one side of the association or to update an entity without loading it.
如果您调查getReferece()
的代码,您会注意到在某些情况下将导致数据库调用:
if ($class->subClasses) {
return $this->find($entityName, $sortedId);
}
最后,getPartialReference()
将部分引用标记为只读,更好地定义它的目的:
$this->unitOfWork->markReadOnly($entity);
答案 1 :(得分:1)
您可以创建特殊参考对象。更多信息请参阅this问题
$item = $em->getReference('FQCNBundle:Item', 2);
$orderItem = new OrderItem();
$orderItem->setItem($item);
$em->persist($orderItem);
$em->flush();