主义2 - 持有实体与加入表的外键反对外国实体

时间:2017-07-06 17:17:41

标签: php doctrine-orm

我正在努力坚持TradeEntity。 TradeEntity与CurrencyEntity具有OneToOne关系。

  /**
    * @ORM\OneToOne(targetEntity="Repositories\Currency\CurrencyEntity")
    * @ORM\JoinColumn(name="currency", referencedColumnName="id")
    *
    * @var CurrencyEntity
    */
    protected $currency;

我从另一个对象收到了CurrencyEntity,我正试图在这个新的TradeEntity中插入并将其持久保存到数据库但得到例外:

Type: Doctrine\ORM\ORMInvalidArgumentException
Message: Expected value of type "Repositories\Currency\CurrencyEntity" 
for association field "Repositories\Trade\TradeEntity#$currency", got "integer" instead.

如果没有从数据库中获取CurrencyEntity并将其设置为那样,是否有其他方式可以持久保存TradeEntity?

1 个答案:

答案 0 :(得分:3)

根据我最近的发现,我觉得有必要更新这个答案。

阅读about Doctrine's advanced configuration,我遇到了Reference Proxies

  

方法EntityManager#getReference($entityName, $identifier)允许您获取对已知标识符的实体的引用,而无需从数据库中加载该实体。

     

当您想要与具有标识符的实体建立关联时,这可用作性能增强。你可以这样做:

<?php
// $em instanceof EntityManager, $cart instanceof MyProject\Model\Cart
// $itemId comes from somewhere, probably a request parameter
$item = $em->getReference('MyProject\Model\Item', $itemId);
$cart->addItem($item);

旧答案:

可以做的是(它违背了ORM的目的,但它 可能):

$conn = $entityManager->getConnection();
$conn->insert(
    'table_name', 
    array(
        'column_name' => 'column_value',
        // define all the columns here 
    )
);

请参阅Doctrine的Data Retrieval And Manipulation