3

基于这篇文章:如何设置外键 id #sf2 #doctrine2 的 id

在上一篇文章中我找到了这个解决方案

class Item
{
/**
 * @ORM\ManyToOne(targetEntity="MyBundle\Entity\ItemType", inversedBy="itemTypes")
 * @ORM\JoinColumn(name="type_id", referencedColumnName="id")
 */
protected $item_type;
/**
 * 
 * @var string $item_type_id
 * @ORM\Column(type="integer")
 */
protected $item_type_id;
}
.... Setter & Getter
}

这让我可以做这样的事情

$item = new Item();
$item->setItemTypeId(2); // Assuming that the ItemType with id 2 exists.

但是从理论上的最新更新 2.3 开始,它不再起作用了。

当我持久化项目(因此创建 INSERT SQL 查询)时,它不会设置 item_type_id 字段。只有所有其他字段。

知道如何手动设置 item_type_id 而无需在设置之前检索 ItemType 吗?查询的使用过度了!?

$item = new Item();
$itemType = $this->entity_manager->getRepository('Acme\MyBundle:ItemType')->find(2);
$item->setItemType($itemType); // Assuming that the ItemType with id 2 exists.
4

1 回答 1

12

我找到了这个问题的解决方案。

当我们使用 ORM 时,我们通常不使用元素的标识符,而只使用对象本身。

但有时使用对象 ID 代替对象更方便,例如当我们在会话中存储标识符时(例如:user_id、site_id、current_process_id、...)。

在这种情况下,我们应该使用代理,我将参考 Doctrine 文档以获取更多信息: http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/advanced-configuration.html #reference-proxy

在这个例子中,我们将有这样的事情:

$itemTypeId = 2; // i.e. a valid identifier for ItemType
$itemType = $em->getReference('MyProject\Model\ItemType', $itemTypeId);
$item->setItemType($itemType);

希望它会帮助别人。

于 2012-10-08T18:16:27.277 回答