【问题标题】:How to cascade deletions with Doctrine 1.2?如何使用 Doctrine 1.2 级联删除?
【发布时间】:2011-11-23 22:26:10
【问题描述】:

我一直在与 Doctrine ORM 中的defining cascade behavior 斗争。

根据the documentation,应该使用onDelete: CASCADE 进行数据库级级联(这是我在这里想要实现的)。

一个完整的例子可以在Symfony tutorial上看到。

但是,我的架构中忽略了所有此类级联规范。

以下是相关摘录:

Advancement:
  columns:
    association_id:
      type: integer(4)
      notnull: true
    task_id:
      type: integer(4)
      notnull: true
    state:
      type: enum
      values: ['todo', 'current', 'done', 'cancelled']
      notnull: true
  relations:
    Association:
      class: Association
      local: association_id
      foreignType: one
      onDelete: CASCADE
    Task:
      class: Task
      local: task_id
      foreignType: one
      onDelete: CASCADE

当然,Task 和 Association 表是正确定义的。首先我不会在这里发布它们以避免太长的问题,但请询问是否有必要。

这是生成的 SQL(我的换行符):

CREATE TABLE advancement
(id INTEGER PRIMARY KEY AUTOINCREMENT,
association_id INTEGER NOT NULL,
task_id INTEGER NOT NULL,
state VARCHAR(255) NOT NULL);

没有CASCADE 的踪迹(顺便说一句,也没有REFERENCES……)。当然,级联不起作用,我必须通过更改默认后端操作来手动实现它。

有谁知道我在这里做错了什么?

【问题讨论】:

  • Doctrine在生成的sql(data/sql/schema.sql)末尾生成外键关系,检查是否存在。
  • 不,我实际上已经 grepped 遍历了所有生成的 SQL,但没有任何 CASCADE 的踪迹……不过感谢您的精确!

标签: doctrine symfony1 cascade doctrine-1.2 cascading-deletes


【解决方案1】:

我认为,如果您的 RDBMS(是 MySQL 吗?)不支持级联,那么学说就会闭嘴。如果您将 MySQL 与 MyISAM 存储引擎一起使用(顺便说一下,它也不支持REFERENCES...),就会出现这种情况。如果我是你,我会尝试直接用你的 RDBMS 客户端创建一个级联,只是为了检查它是否可能。

【讨论】:

  • Doctrine 在 mysql 的情况下自动使用 innodb。
  • 我使用的是 SQLite3 (3.6.12),所以shouldn't be a problem :)
  • 您是否尝试过创建一个,只是为了看看它是否适用于您的版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2019-07-09
  • 2023-04-04
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多