Search code examples
many-to-manycascadezend-db-tablecascading-deletes

Zend CASCADE on many-to-many relationship


I'm using the default Zend_Db_Table_Abstract to set the relationships. These are my models:

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,
    )
);

Now when I want to delete a project, using the deleteProject() method in Model_Table_Project, it deletes the entry in the Project table and the entries in the ProjectStage table, but it doesn't delete the entries in the Stage table.

What am I doing wrong?


Solution

  • I've found the solution. It was a thinking error of myself. The solution I now use is:

    In the Table model I call $row->delete() and in the Row model I declared a delete method:

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

    This way it first delete all relating stages and then it deletes itself.