2

我有一个评论表,用于将对象的评论存储在 3 个不同的表中。当我对删除其中一个对象的注释运行功能测试时,它工作正常。但是,如果我运行功能测试以从其他对象中删除注释,我会收到完整性约束 MySQL 错误,因为教义试图“更新”第一个对象表,作为删除与表中对象关联的注释的一部分b 或 c。我无法弄清楚为什么删除评论是试图更新父表。

从 3 个对象表到注释表都有一个删除级联。这些表在 Symfony 1.4 的 YML 中定义

object_a:
  columns:
    some stuff
  relations:
    Comments:
      class: Comments
      local: id
      foreign: object_a_id
      type: many
      foreignType: one
      cascade: [delete]

object_b:
  columns:
    some stuff
  relations:
    Comments:
      class: Comments
      local: id
      foreign: object_b_id
      type: many
      foreignType: one
      cascade: [delete]

object_c:
  columns:
    some stuff
  relations:
    Comments:
      class: Comments
      local: id
      foreign: object_c_id
      type: many
      foreignType: one
      cascade: [delete]

comments:
  columns:
    object_a_id:
       type: integer(4)
    object_b_id
       type: integer(4)
    object_c_id
       type: integer(4)
  relations:
    Object_a:
       local: object_a_id
       foreign: id
       type: one
    Object_b:
       local: object_b_id
       foreign: id
       type: one
    Object_c:
       local: object_c_id
       foreign: id
       type: one

此故障仅在通过 Symfony 1.4 测试工具运行测试时发生。它在开发环境中运行良好。在添加对象 b 和 c 之前,对象 a 是必填字段,但已被删除。我已经运行了 symfony cache:clear --env=test 来查看是否删除了任何可能干扰的缓存学说对象。

编辑: 现在在生产和开发中遇到问题。据我从数据模块和 BaseModel 文件中可以看出,没有理由更新父表。

4

1 回答 1

1

在经历了很多焦虑和头疼之后,我弄清楚了这里发生了什么。

在这种情况下,模式或生成的 PHP 都没有问题。相反,它是由于子类中的 postSave() 操作而发生的。postSave() 操作正在获取父类的属性,该属性已被删除,因此 Doctrine 实际上是在创建一个新对象,然后尝试将其保存为工作单元的一部分。由于新对象没有任何必填字段,MySQL 出错。

一个例子应该更清楚。Object A是带有子对象的父对象Object BObject A有财产foo

$object_a->delete();

触发. postSave()_ Object B这个动作是:

function postSave($event) 
{
  //do something
  $slug = $this->Object_As->foo;
  //do more stuff
}

or if 使用该$this->Object_As->foo事件$event->getInvoker()->getFoo()将尝试创建一个Object_Aif none 存在。现在,有趣的一点是,如果您的 MySQL 表没有必填字段,这最终可能会在Object_A您不知道的情况下创建许多新的 s,直到它在其他地方引起问题。我怀疑这将很难追查到罪魁祸首。

在我的真实用例中,我正在删除缓存元素。当我使用softDelete时,在这种情况下我通过检查invoker删除字段是否为空来解决它,例如:

$event->getInvoker()->getDeleted_at()      
于 2013-03-03T10:46:51.933 回答