学说:建立外国关系

时间:2017-06-14 17:21:37

标签: symfony doctrine-orm

当我尝试将记录插入关联实体时,这是关于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列'two_id'不能为空

我的问题是:

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

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

1 个答案:

答案 0 :(得分:0)

如果有人犯了同样的错误:

正如@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();
相关问题