在 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。
可能的解决方案:
- 运行 类似于
SELECT * FROM User WHERE id IN (:userIds)
。这将是一个相当可怕的解决方法,因为我不需要这些数据,而且它对 ->persist
将触发的查询没有任何影响
- 创建某种伪实体?也许像
$user = new User($userId);
这样的东西然后使用它。 如果可行(我不确定),这将是可怕的,因为 UserID 是一个 GeneratedValue,因此为它添加任何形式的外部 setter 将再次成为相当可怕的骇客
- 完全跨过学说实体系统并通过 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();
我有一组规范化实体(伪代码):
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,因此为它添加任何形式的外部 setter 将再次成为相当可怕的骇客 - 完全跨过学说实体系统并通过 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();