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

Referencing foreign keys entirely by ID when creating entities in Doctrine

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

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,因此为它添加任何形式的外部 setter 将再次成为相当可怕的骇客
  3. 完全跨过学说实体系统并通过 PDO 插入数据。这具有避免 Doctrine 一对一 INSERT 系统相对缓慢的特性的优点,但这意味着我将跳过 Subscription 实体内的 $internalReference 逻辑。这当然可以移到其他地方,但我想尝试了解是否有惯用的方法来做到这一点

经过令人尴尬的短时间后,我找到了 here 之后的答案。

您可以使用实体管理器来创建部分引用,以基本上允许以(相对)干净的方式执行方法 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();