在 Doctrine 中创建实体时完全按 ID 引用外键

我有一组规范化实体(伪代码):


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。

潜在的解决方案:

  1. 运行类似SELECT * FROM User WHERE id IN (:userIds). 这将是一个相当可怕的解决方法,因为我对这些数据不感兴趣,而且它对->persist将触发的查询没有任何影响

  2. 创建某种伪实体?也许像$user = new User($userId);然后使用它。如果这可行(我不确定),这将是可怕的,因为 UserID 是 GeneratedValue,因此为其添加任何形式的外部设置器将再次成为一个相当可怕的黑客攻击

  3. 完全跨过学说实体系统,通过 PDO 插入数据。这具有避免 Doctrine 一对一INSERT系统相对较慢的性质的优点,但这意味着我将跳过$internalReferenceSubscription 实体内部的逻辑。这当然可以移到其他地方,但我想尝试了解是否有一种惯用的方式来做到这一点


小怪兽爱吃肉
浏览 85回答 1
1回答

繁星点点滴滴

经过一段令人尴尬的短时间后,我在这里找到了我想要的答案。您可以使用实体管理器创建部分引用,以本质上允许(相对)干净的方法 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();
打开App,查看更多内容
随时随地看视频慕课网APP