private function afterSaveManyMany($name, $rel, $new_objs, $orig_objs)
{
// get the table name and foreign keys
$tbl_name = $rel->getJunctionTableName();
$tbl_keys = $rel->getJunctionForeignKeys();
if (count($tbl_keys) != 2) {
throw new Exception('You must extend afterSaveManyMany to support multi key many many relationship');
}
$orig_by_id = array();
if ($orig_objs) {
foreach ($orig_objs as $orig) {
$orig_by_id[$orig->getPrimaryKey()] = $orig;
}
}
// array of ids that should be saved
if ($new_objs) {
$_table = Yii::app()->db->schema->getTable($tbl_name);
foreach ($new_objs as $i => $new) {
$pk = $new->getPrimaryKey();
if (@$orig_by_id[$pk]) {
unset($orig_by_id[$pk]);
} else {
// insert statement
$builder = $this->getCommandBuilder();
$criteria = new CDbCriteria();
$data = array($tbl_keys[0] => $this->getPrimaryKey(), $tbl_keys[1] => $new->getPrimaryKey());
if (isset($_table->columns['display_order'])) {
$data['display_order'] = $i + 1;
}
$cmd = $builder->createInsertCommand($tbl_name, $data);
if (!$cmd->execute()) {
throw new Exception("unable to insert many to many record for relation {$name} with pk {$new->getPrimaryKey()}");
}
}
}
}
foreach (array_keys($orig_by_id) as $remove_id) {
// delete statement
$builder = $this->getCommandBuilder();
$criteria = new CDbCriteria();
$criteria->addColumnCondition(array($tbl_keys[0] => $this->getPrimaryKey(), $tbl_keys[1] => $remove_id));
$cmd = $builder->createDeleteCommand($tbl_name, $criteria);
if (!$cmd->execute()) {
throw new Exception("unable to delete removed many to many record for relation {$name} with pk {$remove_id}");
}
}
}