Как я могу сделать следующее в Yii:
У меня есть следующие 4 таблицы:
**Course**
-idCourse;
-title;
-description;
**Participant**
-idParticipant;
-name;
-...
**Register**
-id;
-idCourse;
-idParticipant;
**Pool**
-idPool
-idCourse
-idParticipant
Я хочу добиться этого: при удалении курса я хочу найти всех участников, которые были зарегистрированы для этого курса (в таблице регистрации), и поместить их в таблицу пула.
Как я могу это сделать? Пожалуйста помоги
Первое: вам нужно иметь модель для каждой таблицы, которой вы хотите управлять.
Второе: вам нужно иметь все связанные модели в зависимости от вашей базы данных.
Третье: вам нужно переопределить 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
}
Вы не можете удалить запись, пока у вас есть ее идентификатор в другой таблице в качестве внешнего ключа, вместо переопределения beforeDelete
Вы можете создать функцию moveToPool
и использовать тот же код, который я показал ранее.
Самый простой способ — создать триггер для оператора DELETE. Смотрите здесь учебник о создании триггеров: http://code.tutsplus.com/articles/introduction-to-mysql-triggers—net-12226