Php 条令始终为现有实体启动INSERT而不是更新
假设我有以下实体: App\Entity\main实体:Php 条令始终为现有实体启动INSERT而不是更新,php,symfony,doctrine-orm,doctrine,symfony4,Php,Symfony,Doctrine Orm,Doctrine,Symfony4,假设我有以下实体: App\Entity\main实体: /** * @var object * * @ORM\OneToOne(targetEntity="App\Entity\DependentEntity", fetch="EAGER") * @ORM\JoinColumn(name="DependentEntityType1FK", referencedColumnName="DependentEntityIDPK") */ private $dep
/**
* @var object
*
* @ORM\OneToOne(targetEntity="App\Entity\DependentEntity", fetch="EAGER")
* @ORM\JoinColumn(name="DependentEntityType1FK", referencedColumnName="DependentEntityIDPK")
*/
private $dependentEntityType1;
/**
* @var object
*
* @ORM\OneToOne(targetEntity="App\Entity\DependentEntity", fetch="EAGER")
* @ORM\JoinColumn(name="DependentEntityType2FK", referencedColumnName="DependentEntityIDPK")
*/
private $dependentEntityType2;
基本上,使用主实体表中的两个不同列,从主实体到同一从属实体的一个方向1:1关系
无论我是使用fetch=“EAGER”
还是通过Doctrine代理类进行正常的延迟加载,当我执行以下操作时,这都无关紧要:
$mainEntity = $this->mainEntityRepository->find(74);
$mainEntity->setDependentEntityType1($this->dependentEntityRepository->find(35));
$this->mainEntityRepository->saveTest($mainEntity);
其中::saveTest()
是:
public function saveTest(MainEntity $mainEntity) {
$this->_em->persist($mainEntity->getDependentEntityType1());
$this->_em->merge($mainEntity);
$this->_em->flush();
}
它总是尝试向表中插入一个新的依赖实体,即使我从未做过任何更改(即使我做了更改,也应该对其进行更新!)
问题是:如果我做了$this->dependentEntityRepository->find(35)
,那么条令为什么会决定这个依赖实体是新的呢
我尝试了fetch=“EAGER”
认为spl\u object\u hash
可能会为代理类实例和实际的DependentEntity实例返回不同的hash,但这并不重要,DependentEntity出于某种原因总是被认为是“新的”
更新:以下是的代码::setDependentEntityType1()
一边谢谢@ficuscr!问题是这是一个单向关系,因此依赖实体没有一个带有
main\u entity\u id
的列,我们不需要在其中包含对主实体的引用的属性,因此我不能将任何内容放入所属(主实体)的inversedBy
。闻起来很熟悉,但在看医生的时候却很困(我就是这么做的),所以我不想打赌答案。很高兴你明白了!抱歉误会,我的意思是感谢你的评论:)但问题仍然存在。我刚才解释说我不能把任何东西放入inversedBy中,因为依赖实体中没有任何东西指向主实体,因为它是单向映射。明白我的意思了吗:)你能更清楚地说明函数setDependentyType1
的作用吗?这里有点奇怪。我从未在《教义》中写过这样的东西。FYImerge
应在中删除。一边谢谢@ficuscr!问题是这是一个单向关系,因此依赖实体没有一个带有main\u entity\u id
的列,我们不需要在其中包含对主实体的引用的属性,因此我不能将任何内容放入所属(主实体)的inversedBy
。闻起来很熟悉,但在看医生的时候却很困(我就是这么做的),所以我不想打赌答案。很高兴你明白了!抱歉误会,我的意思是感谢你的评论:)但问题仍然存在。我刚才解释说我不能把任何东西放入inversedBy中,因为依赖实体中没有任何东西指向主实体,因为它是单向映射。明白我的意思了吗:)你能更清楚地说明函数setDependentyType1
的作用吗?这里有点奇怪。我从未在《教义》中写过这样的东西。FYImerge
应在中删除。
public function setDependentEntityType1(DependentEntity $dependentEntity) : void {
$this->dependentEntity = $dependentEntity;
}