Symfony2:通过id建立模型关系

时间:2013-06-07 08:36:26

标签: symfony

我正在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,但我认为这是一种不太有效的方法。

那怎么办呢?

2 个答案:

答案 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查询完整实体可能更安全。

getPartialReference()vs getReference()

我最初也发现了被遗忘的东西,但我不认为这是正确的解决方案。

这两种方法似乎几乎相同,都在官方文档中引用。 似乎只有通过直接查看源代码才能确定哪个最佳的合理方法: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();