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


doctrine,application level cascade: [delete] does not work

>我正在使用学说的软删除,删除后我想删除相关记录。

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

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)

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

我正在使用的 DQL 是。

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

我哪里出错了?

四处寻找一段时间后,我终于自己找到了解决方案。 希望这可以帮助与我有相同问题的人。

下面是应用程序级别删除级联工作的一些条件。

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

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

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

教义文件对此并不清楚。 我不得不参考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