1

我正在使用教义的 SoftDelete,删除后我想 SofDelete 相关记录。

这是我正在使用的架构文件。

detect_relations: true
User:
  actAs:
    Timestampable:
    SoftDelete:
    Sluggable:
      unique: true
      fields: [name]
      canUpdate: true
  tableName: user
  columns:
    name:
      type: string(50)
      notnull: true
    email:
      type: string(50)
      notnull: true
      unique: true
    password:
      type: string(50)
      notnull: true
    business_id: integer
  relations:
    Business:
      cascade: [delete]
Business:
  actAs:
    Timestampable:
    SoftDelete:
    Sluggable:
      unique: true
      fields: [name]
      canUpdate: true
  tableName: business
  columns:
    name:
      type: string(50)
      notnull: true
    website: string(100)
    address: string(100)

当我尝试 SoftDelete 用户时,它不会从业务表中删除相关记录(即它不会更新deleted_at业务表中的标志)。仅deleted_at更新用户表中的标志。

我使用的 DQL 是。

$q = Doctrine_Query::create()
    ->delete('Model_User u')
    ->where('u.id = ?', $id);
$q ->execute();

我哪里错了?

4

1 回答 1

4

经过一段时间的搜索,我终于自己找到了解决方案。希望这可以帮助与我有同样问题的人。

以下是应用程序级删除级联工作的几个条件。

  • 与 save() 操作不同,delete() 级联需要显式打开

除了cascade: [delete]在您的模式中定义之外,重要的是要注意您还需要明确定义关系。
如果您依赖于detect_relations: true您生成所有关系,这将不适用于应用程序级删除级联。(至少它对我不起作用,在手动定义它工作的关系之后)。

  • 在执行 DQL 更新和删除语句时,应用程序级级联 save() 和 delete() 不适用,只有在对象上调用 save() 和 delete() 时才适用。

学说文件对此并不清楚。我必须参考 symfony 文档才能理解。学说文件只说。

以下描述了通过$record->delete()删除记录时的通用过程:

对我来说,这很令人困惑。但是在阅读了 symfony 的教义文档之后,我很清楚如何去做。所以不要通过 DQL 删除。我不得不用这个。

$user = Doctrine_Core::getTable('User')->find(1)
$user->delete();

和繁荣,它的工作原理。:)

PS:如果有人想参考,这里是 symfony 文档的链接。

http://www.symfony-project.org/doctrine/1_2/en/04-Schema-Files#chapter_04_sub_application_level

这是一个帖子的链接,它澄清了我的疑问,但它没有任何用处:)

https://groups.google.com/forum/?fromgroups#!topic/doctrine-user/POq6ybO01lg%5B1-25%5D

于 2012-08-15T04:52:36.843 回答