|  |  |  | @ -530,8 +530,8 @@ class ActiveRecord extends Model | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function isAttributeChanged($name) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if (isset($this->_attribute[$name], $this->_oldAttributes[$name])) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return $this->_attribute[$name] !== $this->_oldAttributes[$name]; | 
			
		
	
		
			
				
					|  |  |  |  | 		if (isset($this->_attributes[$name], $this->_oldAttributes[$name])) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return $this->_attributes[$name] !== $this->_oldAttributes[$name]; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			return isset($this->_attributes[$name]) || isset($this->_oldAttributes); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
	
		
			
				
					|  |  |  | @ -590,7 +590,11 @@ class ActiveRecord extends Model | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function save($runValidation = true, $attributes = null) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		return $this->getIsNewRecord() ? $this->insert($runValidation, $attributes) : $this->update($runValidation, $attributes); | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->getIsNewRecord()) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return $this->insert($runValidation, $attributes); | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			return $this->update($runValidation, $attributes) !== false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
	
		
			
				
					|  |  |  | @ -692,11 +696,24 @@ class ActiveRecord extends Model | 
			
		
	
		
			
				
					|  |  |  |  | 	 * $customer->update(); | 
			
		
	
		
			
				
					|  |  |  |  | 	 * ~~~ | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Note that it is possible the update does not affect any row in the table. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * In this case, this method will return 0. For this reason, you should use the following | 
			
		
	
		
			
				
					|  |  |  |  | 	 * code to check if update() is successful or not: | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * ~~~ | 
			
		
	
		
			
				
					|  |  |  |  | 	 * if ($this->update() !== false) { | 
			
		
	
		
			
				
					|  |  |  |  | 	 *     // update successful | 
			
		
	
		
			
				
					|  |  |  |  | 	 * } else { | 
			
		
	
		
			
				
					|  |  |  |  | 	 *     // update failed | 
			
		
	
		
			
				
					|  |  |  |  | 	 * } | 
			
		
	
		
			
				
					|  |  |  |  | 	 * ~~~ | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param boolean $runValidation whether to perform validation before saving the record. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * If the validation fails, the record will not be inserted into the database. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param array $attributes list of attributes that need to be saved. Defaults to null, | 
			
		
	
		
			
				
					|  |  |  |  | 	 * meaning all attributes that are loaded from DB will be saved. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return boolean whether the attributes are valid and the record is updated successfully. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return integer|boolean the number of rows affected, or false if validation fails | 
			
		
	
		
			
				
					|  |  |  |  | 	 * or [[beforeSave()]] stops the updating process. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function update($runValidation = true, $attributes = null) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
	
		
			
				
					|  |  |  | @ -708,13 +725,15 @@ class ActiveRecord extends Model | 
			
		
	
		
			
				
					|  |  |  |  | 			if ($values !== array()) { | 
			
		
	
		
			
				
					|  |  |  |  | 				// We do not check the return value of updateAll() because it's possible | 
			
		
	
		
			
				
					|  |  |  |  | 				// that the UPDATE statement doesn't change anything and thus returns 0. | 
			
		
	
		
			
				
					|  |  |  |  | 				$this->updateAll($values, $this->getOldPrimaryKey(true)); | 
			
		
	
		
			
				
					|  |  |  |  | 				$rows = $this->updateAll($values, $this->getOldPrimaryKey(true)); | 
			
		
	
		
			
				
					|  |  |  |  | 				foreach ($values as $name => $value) { | 
			
		
	
		
			
				
					|  |  |  |  | 					$this->_oldAttributes[$name] = $this->_attributes[$name]; | 
			
		
	
		
			
				
					|  |  |  |  | 				} | 
			
		
	
		
			
				
					|  |  |  |  | 				$this->afterSave(false); | 
			
		
	
		
			
				
					|  |  |  |  | 				return $rows; | 
			
		
	
		
			
				
					|  |  |  |  | 			} else { | 
			
		
	
		
			
				
					|  |  |  |  | 				return 0; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			return true; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
	
		
			
				
					|  |  |  | @ -763,17 +782,18 @@ class ActiveRecord extends Model | 
			
		
	
		
			
				
					|  |  |  |  | 	 * In the above step 1 and 3, events named [[EVENT_BEFORE_DELETE]] and [[EVENT_AFTER_DELETE]] | 
			
		
	
		
			
				
					|  |  |  |  | 	 * will be raised by the corresponding methods. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return boolean whether the deletion is successful. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return integer|boolean the number of rows deleted, or false if the deletion is unsuccessful for some reason. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Note that it is possible the number of rows deleted is 0, even though the deletion execution is successful. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function delete() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->beforeDelete()) { | 
			
		
	
		
			
				
					|  |  |  |  | 			// we do not check the return value of deleteAll() because it's possible | 
			
		
	
		
			
				
					|  |  |  |  | 			// the record is already deleted in the database and thus the method will return 0 | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->deleteAll($this->getPrimaryKey(true)); | 
			
		
	
		
			
				
					|  |  |  |  | 			$rows = $this->deleteAll($this->getPrimaryKey(true)); | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->_oldAttributes = null; | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->afterDelete(); | 
			
		
	
		
			
				
					|  |  |  |  | 			return true; | 
			
		
	
		
			
				
					|  |  |  |  | 			return $rows; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
	
		
			
				
					|  |  |  | 
 |