2

私はSymfony2でAPIを構築しています.Model ItemとManyToOneの関係を持つModel ItemOrderがあります。データベースにいくつかのアイテムがあり、データベースに既に存在し、ID がわかっているアイテムを指す ItemOrder を追加したいと考えています。だから私の最初のアプローチはこれです:

$item = new Item();
$item->setId(2);

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

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

しかし、Symfony2 は、私が新しいアイテムを作成しようとしていることを理解しています。有効なアプローチは、エンティティ マネージャーを使用して Item オブジェクトをフェッチし、それを ItemOrder に割り当てることであることは知っていますが、あまり効率的な方法ではないと思います。

では、これはどのように行うべきでしょうか?

4

2 に答える 2

3

あなたが探しているのはPartial Referenceと呼ばれるものです。

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

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

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

ただし、何が問題なのかをお読みください。パラグラフを慎重に検討する必要がありますが、代わりに ID で完全なエンティティをクエリする方が安全な場合があります。

getPartialReference() と getReference()

私は元々、forgetbasがリンクしたものも見つけましたが、それが正しい解決策だとは思いません.

これら 2 つの方法はほとんど同じように見え、どちらも公式ドキュメントで参照されています。どちらが最適かを判断する唯一の合理的な方法は、ソース コード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);
于 2013-06-07T10:01:10.413 に答える