Отключить save() в модели на основе оператора if (Yii 1.x.x)

Я запускаю некоторый код в своей модели, который делает следующее:

public function beforeSave()
{
  $this->parent_exists = FALSE;
  // search for existing parent..
  $existing_parent = Myparents::model()->findByAttributes(array('email' => $this->email)); //

    if (isset($existing_parent) && is_object($existing_parent))
    {
      // WHERE I AM STUCK...
      // need to disable/override the save() to prevent the INSERT into the table
    } else {
      // proceed as normal with the 'normal' save() method
    }
}

Может ли кто-нибудь объяснить, как я предотвращаю выполнение запроса INSERT с помощью метода save(), когда оператор IF верен, но если оператор FALSE, действуйте как обычно с помощью save()

Любые идеи?


person Zabs    schedule 23.07.2014    source источник


Ответы (2)


Сделайте это правилом проверки вместо правила перед сохранением. Помните, что функция beforeSave срабатывает только при сохранении одного элемента.

http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/ http://www.yiiframework.com/doc/api/1.1/CActiveRecord#beforeSave-detail

/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
    return array(
       array('email', 'hasNoParent'),
    );
}


/**
 * Check for parent
 *
 * @param string $attribute
 * @param array  $params
 */
public function hasNoParent($attribute, $params)
{
    $existingParent = Myparents::model()->findByAttributes(array(
        'email' => $this->$attribute
    ));

    if (isset($existingParent) && $existingParent instanceof Myparents){
         $this->addError($attribute, 'your password is not strong enough!');
    }
}
person Zombiesplat    schedule 24.07.2014

Просто верните true или false в beforeSave(), как показано ниже, если beforeSave() возвращает false, вставка не происходит. Также обратите внимание, что вам нужно вызвать родительскую реализацию, как я сделал ниже, чтобы события вызывались правильно.

public function beforeSave()
{
  if(parent::beforeSave()){
      $this->parent_exists = FALSE;
      // search for existing parent..
      $existing_parent = Myparents::model()->findByAttributes(array('email' => $this->email)); //

       if (isset($existing_parent) && is_object($existing_parent))
       {
            // WHERE I AM STUCK...
            // need to disable/override the save() to prevent the INSERT into the table
            return false;
       } else {
            return true;
           // proceed as normal with the 'normal' save() method
       } 
      return true;// return T/F for not set case as well
    } else {
        return false;
    }
}

См. http://www.yiiframework.com/doc/api/1.1/CActiveRecord#beforeSave-detail

person Manquer    schedule 23.07.2014
comment
Обратите внимание, что функция beforeSave() не сработает при массовом сохранении (более одного элемента). Добро пожаловать в Yii. - person lin; 23.07.2014
comment
причина этого в том, что запрос построен для одиночной вставки, а множественная вставка отличается. У каждого ORM есть свои причуды. ActiveRecord ничем не отличается :) - person Manquer; 24.07.2014