gpt4 book ai didi

mysql - Zend Framework - 数据库表递归级联删除问题

转载 作者:行者123 更新时间:2023-11-30 23:41:03 24 4
gpt4 key购买 nike

我的情况可能有点不正常,但我在我的 MySQL 数据库中定义了外键,同时在 Zend_Db_Table 类中强制引用完整性。这些表使用 InnoDB 存储引擎。

删除记录时,Zend Framework 会通过表模型中的$_referenceMap 正确识别直接子项并删除它们。但是,如果有直系子项的任何子项,我会从数据库返回有关违反该外键参照完整性的错误:SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent行:外键约束失败。看起来 Zend_Db_Table_Abstract 没有以递归方式强制引用完整性。

有没有人遇到过这个?是Zend Framework bug吗?解决方法?修复?


更新

将近一个星期后,我还没有对这个问题作出答复。我想我必须自己扩展 Zend_Db_Table_Row_Abstract 类才能完成此任务。

最佳答案

我最终扩展了 Zend_Db_Table_Abstract 类来实现这一点。 _cascadeDelete 公共(public)函数调用数据库适配器delete 函数。我进行了更改,以便调用 Zend_Db_Table_Row_Abstract 中的 delete 函数。这使得记录删除具有递归性。

更新:我添加了删除时设置为 self::SET_NULL 的代码。

这是我对 _cascadeDelete 的修改版本:

/**
* Called by parent table's class during delete() method.
*
* @param string $parentTableClassname
* @param array $primaryKey
* @return int Number of affected rows
*/
public function _cascadeDelete($parentTableClassname, array $primaryKey)
{
$this->_setupMetadata();
$rowsAffected = 0;
foreach ($this->_getReferenceMapNormalized() as $map) {
if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) {
switch ($map[self::ON_DELETE]) {
case self::CASCADE:
$select = $this->select();
for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
$col = $this->_db->foldCase($map[self::COLUMNS][$i]);
$refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
$type = $this->_metadata[$col]['DATA_TYPE'];
$select->where($this->_db->quoteIdentifier($col, true) . ' = ?',
$primaryKey[$refCol], $type);
}
$rows = $this->fetchAll($select);
$rowsAffected += count($rows);
foreach ($rows as $row) {
$row->delete();
}
break;
case self::SET_NULL: {
$update = array();
$where = array();
for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
$col = $this->_db->foldCase($map[self::COLUMNS][$i]);
$refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
$type = $this->_metadata[$col]['DATA_TYPE'];
$update[$col] = null;
$where[] = $this->_db->quoteInto(
$this->_db->quoteIdentifier($col, true) . ' = ?',
$primaryKey[$refCol], $type);
}
$rowsAffected += $this->update($update, $where);
break;
}
default:
// no action
break;
}
}
}
return $rowsAffected;
}

关于mysql - Zend Framework - 数据库表递归级联删除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3023809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com