【问题标题】:Zend CASCADE on many-to-many relationshipZend CASCADE 关于多对多关系
【发布时间】:2012-02-20 17:35:19
【问题描述】:

我使用默认的 Zend_Db_Table_Abstract 来设置关系。这些是我的模型:

Model_Table_Project:

protected $_name = 'projects';
protected $_dependentTables = array('Model_Table_ProjectStage');
protected $_referenceMap = array(
    'User' => array(
        'columns' => 'userId',
        'refTableClass' => 'Model_Table_User',
        'refColumns' => 'id'
    )
);

public function deleteProject($id)
{
    $row = $this->find($id)->current();
    if ($row)
    {
        $row->delete();
    }
    else
    {
        throw new Zend_Exception('Cannot delete project.');
    }
}

Model_Table_Stage:

protected $_name = 'stages';
protected $_dependentTables = array('Model_Table_ProjectStage');

Model_Table_ProjectStage:

protected $_name = 'projectstage';
protected $_referenceMap = array(
    'Project' => array(
        'columns' => 'projectId',
        'refTableClass' => 'Model_Table_Project',
        'refColumns' => 'id',
        'onDelete' => self::CASCADE,
    ),
    'Stage' => array(
        'columns' => 'stageId',
        'refTableClass' => 'Model_Table_Stage',
        'refColumns' => 'id',
        'onDelete' => self::CASCADE,
    )
);

现在,当我想删除一个项目时,使用 Model_Table_Project 中的 deleteProject() 方法,它会删除 Project 表中的条目和 ProjectStage 表中的条目,但不会删除 Stage 表中的条目。

我做错了什么?

【问题讨论】:

    标签: many-to-many cascade zend-db-table cascading-deletes


    【解决方案1】:

    我找到了解决方案。这是我自己的一个思维错误。我现在使用的解决方案是:

    在 Table 模型中我调用 $row->delete() 并在 Row 模型中声明了一个删除方法:

    public function delete()
    {
        $stages = $this->getStages();
    
        foreach ($stages as $stage)
        {
            $stage->delete();
        }
    
        return parent::delete();
    }
    

    这样它会先删除所有相关的阶段,然后再删除自己。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2018-12-01
      • 2011-01-05
      • 1970-01-01
      • 2011-11-09
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多