Yii多个活动记录的删除

4

我需要一些代码建议。 我有两个相互依存的模型。 当其中一个模型被删除时,我希望确保数据库中的两个记录都被删除。

我使用外键处理了其中一个方向,因此如果父记录被删除,它们也会被删除。 但是,由于这些行彼此相互依存,我需要在子模型中发生相同的功能。

在子模型中,我重载了删除方法,使其如下所示:

    public function delete() {

    $cameraTransaction = $this->dbConnection->beginTransaction();

    try
    {
        $this->ftpuser->delete();
        if($this->beforeDelete())
        {
            $result=$this->deleteByPk($this->getPrimaryKey())>0;
            $this->afterDelete();
        }
        $cameraTransaction->commit();
    }
    catch(Exception $e) // an exception is raised if a query fails
    {
        $cameraTransaction->rollBack();
    }

}

我已经进行了测试,似乎效果不错。我想知道是否有专家/大师可以确认我做得对 :)

谢谢

艾伦


我认为最好在数据库层面上完成这个任务。你是否可以(假设你使用的是MySQL)在这两个表之间创建一个关联,并使用ON DELETE CASCADE - Stu
你可以使用 "ON DELETE CASCADE",但在此之前,请阅读此链接 https://dev59.com/NXVC5IYBdhLWcg3wfhKL - Onkar Janwa
抱歉,我在问题中应该表述得更清楚。我使用了DELETE级联,但这仅适用于从父级->子级的情况,而不是当子级被删除时。 - Alan Hollis
1个回答

2

我认为你做得很对。你可以将其变成更普遍的内容。

每个模型都有定义的关系,使一些(或全部)关系可删除。你必须标记它们(以某种方式)可删除,并与当前记录一起进行标记。

我会在模型中除了relations()之外定义一个新的函数。

function deletableRelations() {
    return array('ftpuser', 'childs', .....);
}

并定义一些通用函数(请在此函数中包括数据库事务)。

function DeleteRelationships($model) {
    foreach( $model->deletableRelations() as $relation ) {
        if( $model->$relation == null) continue;

        if( is_array($model->$relation)) {
            foreach( $model->$relation as $relRecord ) {
                $relRecord->delete();
            }
        }
        else {
            $model->$relation->delete();
        }
    }
}

这个通用函数可以用于你的任何模型。 请确保此处不会发生递归(即父项删除子项...但子项也试图删除父项)。


1
考虑只发出一个请求来删除相关记录,以避免频繁执行“DELETE FROM ... WHERE id=..”的操作。 - Leto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接