2017-06-14 36 views
0

这是关于当我试图将一条记录插入一个关联实体时与教义的问题。以下是对问题的简单描述。学说:设置外交关系

我有两个表,我们称它们为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()吗?自动

    正如@lordrhodos指出,宣告场$twoId是错误的,因为学说将创建它,而无需一个:(PhpStorm甚至不承认它)

+0

我们需要看到的代码模型。我想知道为什么你在'One'实体上有一个'setTwoId()'函数。关于你的第二个问题:在entityManager上使用引用需要知道id。它将通过代理类获取对象,并在您尝试访问该类的其他属性时尽快将其保存,因此可以使用它来引用它。 – lordrhodos

+0

你是对的@主持人,有'setTwoId'功能是一个坏主意。感谢帮助。 – user3429660

回答

0

如果有人做了同样的错误定义。

定义:

/** 
* @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();