public function initOrder()
 {
     list($table, $fk1, $fk2) = SqlHelper::parseManyMany($this->owner, $this->relation);
     $model = $this->getOwner();
     $category_ids = CHtml::listData($model->{$this->relation}, 'id', 'id');
     if (!$category_ids) {
         return true;
     }
     $builder = Yii::app()->db->getCommandBuilder();
     $criteria = new CDbCriteria();
     $criteria->select = "MAX(`{$this->map_field}`)";
     $command = Yii::app()->db->createCommand()->select('id')->from($table);
     foreach ($category_ids as $cat_id) {
         $comm = clone $command;
         $id = $comm->where(array('and', "`{$fk1}`={$model->getPrimaryKey()}", "`{$fk2}`={$cat_id}", "`{$this->map_field}`=0", array('in', $fk2, $category_ids)))->queryScalar();
         $cr = clone $criteria;
         $cr->addCondition('t.' . $fk2 . '=' . $cat_id);
         $max = $builder->createFindCommand($table, $cr)->queryScalar();
         $max++;
         Yii::app()->db->createCommand("UPDATE `{$table}` SET  `{$this->map_field}`={$max} WHERE `id`={$id}")->execute();
     }
 }
 /**
  * @param $relations массив ($relation => $exclude), где $exclude - массив id объектов связи с которыми разрывать не нужно
  *
  * @return bool
  */
 public function clear($relations)
 {
     try {
         $commands = array();
         foreach ($relations as $relation => $exclude) {
             list($table, $fk1, $fk2) = SqlHelper::parseManyMany($this->owner, $relation);
             $criteria = new CDbCriteria(array('condition' => $fk1 . '=' . $this->owner->id));
             $excl = array();
             foreach ($exclude as $ex) {
                 $excl[] = is_object($ex) ? $ex->id : $ex;
             }
             $criteria->addNotInCondition($fk2, $excl);
             $commands[] = Yii::app()->db->getCommandBuilder()->createDeleteCommand($table, $criteria);
         }
         foreach ($commands as $c) {
             $c->execute();
         }
         //no commit, because withRelated save
         return true;
     } catch (CException $e) {
         $this->getOwner()->rollback($e);
     }
     return false;
 }