【发布时间】: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