【问题标题】:Doctrine changing ID of injected data注入数据的教义改变ID
【发布时间】:2014-03-05 04:21:01
【问题描述】:

我有一些注入数据来启动 Doctrine。

我的会员(用户)表看起来像

id | first_name | last_name | email | password ...

数据注入如下:

INSERT INTO member (id, first_name, last_name, email, password) VALUES (1, "Default", "System", "default@system.com", "system_pass")

正在运行$defaultMember = $repository->findOneBy(array("first_name" => "Default")) 产生一个成员对象,_em->contains($defaultMember) 为真。该对象甚至在调试器中显示 ID 为 1。然而,当我做出更改:$defaultMember->setFirstName("Default2") 并刷新回数据库时,它会尝试插入一个新的(重复的)成员,无论序列中的下一个 id 是什么。

【问题讨论】:

  • 如果没有进行这些更改的代码,就不可能提供任何建议。
  • 我添加了进行更改的代码。该名称不是任何键或索引的一部分。
  • 代码远远不够。我们需要了解从获取 repo 到刷新操作的全部内容。

标签: php symfony doctrine-orm audit-trail


【解决方案1】:

我在插入新记录而不是更新现有记录时遇到了类似的问题。我的问题是由$entity2 = clone $entity1 引起的。之后我更新了$entity2->name = $newName 然后尝试保存它(persist() 然后 flush())。我希望它会在给出 id 时更新现有记录。但是没有,它插入了一条新记录。

在使用 xdebug 跟踪代码后,我发现每个对象都将被 spl_object_hash($object) 索引,这将返回 $object 的唯一 ID。如果 id 与被索引的不同,SF2 将尝试插入一条新记录。

我不知道您是否尝试过持久化克隆对象,但我想原因与我的相同。尝试以这种方式进行调查,您可以使其随心所欲地工作。否则,请发布更多代码,然后人们可以更轻松地帮助您。

【讨论】:

    【解决方案2】:

    问题已通过 id 的 getter/setter 组合解决(不确定这是否是根本问题),并在存储库中使用 $this->_em 而不是 $this->getEntityManager()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 2019-03-16
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多