Вставить строки в таблицу2, когда строка удалена в таблице1

Как я могу сделать следующее в Yii:

У меня есть следующие 4 таблицы:

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

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

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

**Pool**
-idPool
-idCourse
-idParticipant

Я хочу добиться этого: при удалении курса я хочу найти всех участников, которые были зарегистрированы для этого курса (в таблице регистрации), и поместить их в таблицу пула.

Как я могу это сделать? Пожалуйста помоги

0

Решение

Первое: вам нужно иметь модель для каждой таблицы, которой вы хотите управлять.
Второе: вам нужно иметь все связанные модели в зависимости от вашей базы данных.
Третье: вам нужно переопределить 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
}

Моя рекомендация

Вы не можете удалить запись, пока у вас есть ее идентификатор в другой таблице в качестве внешнего ключа, вместо переопределения beforeDelete Вы можете создать функцию moveToPool и использовать тот же код, который я показал ранее.

1

Другие решения

Самый простой способ — создать триггер для оператора DELETE. Смотрите здесь учебник о создании триггеров: http://code.tutsplus.com/articles/introduction-to-mysql-triggers—net-12226

0

По вопросам рекламы [email protected]