BaseActiveRecord::afterSaveManyMany PHP Method

afterSaveManyMany() private method

private afterSaveManyMany ( $name, CManyManyRelation $rel, $new_objs, $orig_objs )
$name
$rel CManyManyRelation
$new_objs
$orig_objs
    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}");
            }
        }
    }