【问题标题】:Doctrine: set foreign relation教义:设定对外关系
【发布时间】:2017-07-02 02:55:39
【问题描述】:

当我尝试将记录插入关联实体时,这是关于 Doctrine 的问题。以下是问题的简化描述。

我有两张桌子,我们称它们为OneTwo。表One 具有表Two 的外键,称为twoId,列two_id。字段 two_id 恰好是主键的一部分。

 * @ORM\Id
 * @ORM\Column(name="user_id", type="string", length=40)
 */
private $twoId;

/**
 * @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER")
 * @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $two;

我正在尝试在表 A 中插入一条新记录。这可行:

$two = [.. read from DB ..];
$one = new One();

$one->setTwo($two);
$one->setTwoId($two->getId());

$em->persist($one);
$em->flush();

我不喜欢同时拨打setTwosetTwoId。此外,我不喜欢在引用 $two 记录之前阅读它。

如果我跳过setTwoId 调用,我会收到错误:[..] 类型的实体缺少为字段“twoId”分配的 ID。此实体的标识符生成策略要求在调用 EntityManager#persist() 之前填充 ID 字段。

如果我跳过setTwo 调用,我会收到错误消息:违反完整性约束:1048 Column 'two_id' cannot be null

我的问题是:

  1. 如何避免同时调用setTwo()setTwoId()

  2. 如果我想从Two 引用一个实体而不阅读它怎么办?我应该使用$em->getReference() 吗? (PhpStorm 甚至都认不出来)

【问题讨论】:

  • 我们需要查看模型的代码。我想知道为什么您在 One 实体上有一个 setTwoId() 函数。关于您的第二个问题:使用 entityManager 上的引用需要知道 id。它将通过代理类获取对象,并在您尝试访问该类的更多属性时立即对其进行水合,所以是的,您可以使用它来引用它。
  • 你是对的@lordrhodos,拥有setTwoId 函数是个坏主意。感谢您的帮助。

标签: symfony doctrine-orm


【解决方案1】:

万一有人犯了同样的错误:

正如@lordrhodos 所指出的,声明字段$twoId 是错误的,因为Doctrine 会在没有定义的情况下自动创建它。

定义:

/**
 * @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER")
 * @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $two;

用法:

$two = [.. read from DB ..];
$one = new One();

$one->setTwo($two);

$em->persist($one);
$em->flush();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2011-01-22
    • 2012-05-29
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多