学说,应用程序级别级联:[删除]不起作用

时间:2012-08-12 13:08:01

标签: php doctrine-1.2

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

这是我正在使用的Schema文件。

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();

我哪里错了?

1 个答案:

答案 0 :(得分:4)

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

这里有一些应用程序级别删除级联工作的条件。

  • 与save()操作不同,delete()级联需要明确启用

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

  • 应用级别级联save()和delete()在执行DQL更新和删除语句时不适用,仅在调用save()和 对象的删除()。

学说文档对此并不清楚。为了理解,我不得不参考symfony文档。学说文档只说。

  

以下介绍删除记录时的一般过程   通过 $ record-> delete()

让我明白这很令人困惑。但经过symfony的学说文档后,我明白了如何去做。所以不要通过DQL删除。我不得不使用它。

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

和Booom,它有效。 :)

P.S:这是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