【问题标题】:Symfony2: establish a model relationship by idSymfony2:通过id建立模型关系
【发布时间】:2013-06-03 11:59:15
【问题描述】:

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

那么这应该怎么做呢?

【问题讨论】:

  • 为什么不$orderItem->setItemId(2);(如果你真的确定你的ItemId 2)?
  • 我应该如何实现该方法?

标签: symfony


【解决方案1】:

您要查找的内容称为Partial Reference

$item = $em->getPartialReference('Item', 2);

$orderItem = new OrderItem();
$orderItem->setItem($item);

$em->persist($orderItem);
$em->flush();

但是,请仔细阅读What is the problem? 段落,通过 id 查询完整实体可能更安全。

getPartialReference() 与 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);

【讨论】:

  • 但是这样你还是在访问数据库,不是吗?
【解决方案2】:

您可以创建特殊的参考对象。更多信息见this问题

$item = $em->getReference('FQCNBundle:Item', 2);

$orderItem = new OrderItem();
$orderItem->setItem($item);

$em->persist($orderItem);
$em->flush();

【讨论】:

  • 在这种情况下我建议不要使用这种方法,请参阅我的更新以获得解释。
  • 你可以在这里看到关于区别的很好的解释stackoverflow.com/questions/11486662/…
  • 你真的看过我的解释吗?您确定 ->getReference() 功能(即延迟加载和附加事件侦听器的能力)是作者的用例吗?
  • 那段代码无法进一步了解发生了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2021-11-26
  • 2017-11-06
  • 1970-01-01
相关资源
最近更新 更多