我有一组规范化实体(伪代码):
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
系统相对较慢的性质的优点,但这意味着我将跳过$internalReference
Subscription 实体内部的逻辑。这当然可以移到其他地方,但我想尝试了解是否有一种惯用的方式来做到这一点
繁星点点滴滴