我有一組規范化實體(偽代碼):User (id, name)Subscription (id, user_id, magazine_id, internal_reference)Magazine (id, name)通常,以標準 Doctrine 方式創建新訂閱很容易:// The internal reference is just to emphasize that I have logic inside the constructor that sets an important value$subscription = new Subscription($textThatWillBeMangledToGenerateInternalReference);$subscription->setMagazine($magazine);$subscription->setUser($user);$this->_em->persist($subscription);$this->_em->flush();然而,在我的用例中,我目前有一個Magazine實體,但有 1000 個用戶 ID。潛在的解決方案:運行類似SELECT * FROM User WHERE id IN (:userIds). 這將是一個相當可怕的解決方法,因為我對這些數據不感興趣,而且它對->persist將觸發的查詢沒有任何影響創建某種偽實體?也許像$user = new User($userId);然后使用它。如果這可行(我不確定),這將是可怕的,因為 UserID 是 GeneratedValue,因此為其添加任何形式的外部設置器將再次成為一個相當可怕的黑客攻擊完全跨過學說實體系統,通過 PDO 插入數據。這具有避免 Doctrine 一對一INSERT系統相對較慢的性質的優點,但這意味著我將跳過$internalReferenceSubscription 實體內部的邏輯。這當然可以移到其他地方,但我想嘗試了解是否有一種慣用的方式來做到這一點
1 回答

繁星點點滴滴
TA貢獻1803條經驗 獲得超3個贊
經過一段令人尷尬的短時間后,我在這里找到了我想要的答案。
您可以使用實體管理器創建部分引用,以本質上允許(相對)干凈的方法 2
在我的問題的背景下的例子:
$subscription = new Subscription($textThatWillBeMangledToGenerateInternalReference);
$subscription->setMagazine($magazine);
$subscription->setUser($this->_em->getPartialReference(User::class, array('id' => $userId)););
$this->_em->persist($subscription);
$this->_em->flush();
- 1 回答
- 0 關注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消