在table1中删除行时,在table2中插入行

时间:2015-01-04 16:17:10

标签: php mysql yii triggers

如何在Yii中执行以下操作:

我有以下4个表格:

**Course**
-idCourse;
-title;
-description;

**Participant**
-idParticipant;
-name;
-...

**Register**
-id;
-idCourse;
-idParticipant;

**Pool**
-idPool
-idCourse
-idParticipant

我想实现这一点:删除课程时,我想找到注册此课程的所有参与者(在注册表中)并将它们放在Pool表中。

我该怎么做?请帮忙

2 个答案:

答案 0 :(得分:1)

首先:您需要为要管理的每个表创建一个模型。 第二:您需要根据数据库设计确定所有相关模型。 第三:您需要在要删除的模型中覆盖beforeDelete或创建moveToPool函数。

模型

class Course extends CActiveRecord {

    public function tableName() {
        return 'course';
    }

    public function relations() {
        return array(
            'registers'=>array(self::HAS_MANY, 'Register', 'idCourse'),
            'pool'=>array(self::HAS_MANY, 'Pool', 'idCourse'),
        );
    }
}

class Participant extends CActiveRecord {

    public function tableName() {
        return 'participant';
    }

    public function relations() {
        return array(
            'registers'=>array(self::HAS_MANY, 'Register', 'idParticipant'),
            'pool'=>array(self::HAS_MANY, 'Pool', 'idParticipant'),
        );
    }
}

class Register extends CActiveRecord {

    public function tableName() {
        return 'register';
    }

    public function relations() {
        return array(
            'register'=>array(self::HAS_ONE, 'Course', 'idCourse'),
            'pool'=>array(self::HAS_ONE, 'Participant', 'idParticipant'),
        );
    }
}

class Pool extends CActiveRecord {

    public function tableName() {
        return 'pool';
    }

    public function relations() {
        return array(
            'register'=>array(self::HAS_ONE, 'Course', 'idCourse'),
            'pool'=>array(self::HAS_ONE, 'Participant', 'idParticipant'),
        );
    }
}

beforeDelete()

此功能必须位于课程模型中。

public function beforeDelete() {
    $models = $this->registers;

    foreach ($models as model) {
       $pool =  new Pool();
       $pool->idCourse = $this->idCourse;
       $pool->idParticipant = $model->idParticipant;
       $pool->save();
    }
    //DO NOT RETURN parent::beforeDelete() or true. 
    //if your database tables are connected in a relationship, 
    //Yii will try to delete the record, a foreign key violation will be triggered
}

我的建议

当您将另一个表中的ID作为外键时,您无法删除该记录,而不是覆盖beforeDelete您可以创建函数moveToPool并使用我之前显示的相同代码。

答案 1 :(得分:0)

最简单的方法是为DELETE语句创建一个触发器。请参阅此处有关创建触发器的教程:http://code.tutsplus.com/articles/introduction-to-mysql-triggers--net-12226