为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
小怪兽爱吃肉 2022-07-22 09:41:26
我有一组规范化实体(伪代码):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();


查看完整回答
反对 回复 2022-07-22
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信