【问题标题】:How to use the cascade_delete config option in CodeIgniter Datamapper如何在 CodeIgniter Datamapper 中使用 cascade_delete 配置选项
【发布时间】:2015-01-20 20:10:01
【问题描述】:

我在我的 PHP 应用程序中使用带有 CodeIgniter Datamapper 的 InnoDB 表来使用 MySQL。通常,通过启动 ->delete 函数调用,用户可以选择通过应用程序删除记录。当一条记录有子记录(一对一或一对多)时,如果数据库中的 FK 约束说明了这些记录,我还希望这些记录与父记录一起被删除。

在这种情况下,我有 2 个表、项目和 input_lines。我已经确认两者都在使用 InnoDB。每个项目可以有许多 input_lines,因此 input_lines 有一个名为 item_id 的字段,该字段被设置为 NULL,被索引,并具有 FK 约束(ON CASCADE DELETE 和 ON CASCADE UPDATE)。我已将 DM 配置文件中的配置元素设置为

$config['cascade_delete'] = FALSE

因为在文档中说如果您使用 ON UPDATE/DELETE CASCADE,您应该这样做。但是,当用户启动$item->delete()方法时,只删除了item,并且与item关联的input_line记录上的item_id字段设置为null。

我的模型如下所示:

class Item extends DataMapper {

  public $has_many = array('labour', 'item_type', 'input_line', 'custom_item_type');

  ...
}

class Input_line extends DataMapper {

  public $has_one = array('item');
  ...
}

我已经尝试使用 cascade_delete = false 和 true 进行此操作,但它不起作用。我知道约束有效,因为使用 MySQL 删除记录直接按预期工作,删除子记录。

我错过了什么?为什么将FK字段设置为null而不是删除记录?

编辑 1:

我决定放弃更好的判断来调试datamapper.php(库目录)中的删除功能。

我在那个函数中注意到了这段代码:

// Delete all "has many" and "has one" relations for this object first
foreach (array('has_many', 'has_one') as $type)
{
    foreach ($this->{$type} as $model => $properties)
    {
        // do we want cascading delete's?
        if ($properties['cascade_delete'])
        {
        ....

所以我 var_dumped $properties 的内容,我看到了这个:

array (size=8)
  'class' => string 'labour' (length=6)
  'other_field' => string 'item' (length=4)
  'join_self_as' => string 'item' (length=4)
  'join_other_as' => string 'labour' (length=6)
  'join_table' => string '' (length=0)
  'reciprocal' => boolean false
  'auto_populate' => null
  'cascade_delete' => boolean true

当模型没有专门初始化属性时,默认值似乎会覆盖配置值。这似乎是一个太明显的错误,所以我肯定在某个地方做错了什么......对吗?我真的真的很想避免破解 DM 核心文件...

编辑 2:

我在想可能找不到配置文件,但我检查了日志,有条目表明 Datamapper 配置文件已成功加载,所以这不是问题。

【问题讨论】:

  • 您使用的是哪个版本的 Datamapper?看起来这在 1.8.1 中已修复。我使用 1.8.1 并将 cascade_delete 设置为 FALSE,在我的 FK 中使用 ON DELETE CASCADE,并且应用程序按预期工作。
  • 1.8.2.你知道修复是什么或我在哪里可以找到变更集?

标签: php mysql codeigniter codeigniter-datamapper


【解决方案1】:

似乎没有人有任何答案。

我的解决方案是将数据映射器库 $cascade_delete 中的属性更改为 false,因为它现在设置为 true。不幸的是,我不得不求助于破解内核,但是 DM 不会尊重我在 cascade_delete 的配置文件中所做的更改,所以我别无选择。

如果有人遇到这个问题并且以前遇到过类似的问题,请发表评论。

【讨论】:

  • 是的,我遇到过这个问题,但不知道解决方案
【解决方案2】:

我遇到了同样的问题,但最后我只是这样做了:

$sql = "DELETE FROM EVENT WHERE event_id=".$event_id.";";
$this->db->query ($sql );

如果我们为指向event_id的外键设置“ON DELETE CASCADE”,上面的SQL可以正常工作,所以我直接调用它。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2012-08-07
    • 2012-01-03
    相关资源
    最近更新 更多