如何在Yii中执行以下操作:
我有以下4个表格:
**Course**
-idCourse;
-title;
-description;
**Participant**
-idParticipant;
-name;
-...
**Register**
-id;
-idCourse;
-idParticipant;
**Pool**
-idPool
-idCourse
-idParticipant
我想实现这一点:删除课程时,我想找到注册此课程的所有参与者(在注册表中)并将它们放在Pool表中。
我该怎么做?请帮忙
答案 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'),
);
}
}
此功能必须位于课程模型中。
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