mod-active-record Yii ActiveRecord with "ifModified then ..." logic and dependencies clearing

  1. Usage
  2. Resources

Class ModActiveRecord is the base class for classes representing relational data. It provides methods to check if attributes were modified and clearing of relations than depends on modified attributes

Usage

Put the class ModActiveRecord into application/protected/components folder.

Change parent of your ActiveRecords classes from CActiveRecord to ModActiveRecord.

Write additional beforeSave() logic if you need to do something if attributes of instatnce were modified.

See samples at gist.github.com

/**
 * This is the model class for table "book".
 *
 * The followings are the available columns in table 'book':
 * @property string $book_id
 * @property string $title
 * @property string $author_id
 *
 * The followings are the available model relations:
 * @property Author $author
 */
class Book extends ModActiveRecord {

	// ...
 
	/**
	 * Define relation with Author class by author_id attribute
	 */
	public function relations()
	{
		return array(
			'author' => array(self::BELONGS_TO, 'Author', 'author_id'),
		);
	}
 
 	/**
	 * Do something before save() when author_id attribute is modified
	 */
	public function beforeSave()
	{
		$authorModified = $this->getModified('author_id');
		if ($authorModified)
		{
			$booksCollection = new BooksCollectionCache;
			if ($authorModified['old'])
				echo "Say 'Goodbye!' to author #", $authorModified['old'], "\n";
			if ($authorModified['new'])
				echo "Say 'Hello!' to author #", $authorModified['new'], "\n";
		}
		return true;
	}
}


// ---

// 1. get old and new attribute values
$book = new Book;
$book->author_id = 1;
var_export($book->getIsModified('author_id')); // --> true
var_export($book->getModified('author_id')); // --> array('old'=>null, 'new'=>1);

// 2. clear dependencies
$book = new Book;
$book->author_id = 1;
echo $book->author->name; // --> Jack London
$book->author_id = 5;
echo $book->author->name; // --> Mark Twain 

// 3. do something before save if attributes were modified
$book->save(); // @see Book::beforeSave()
// --> Say "Hello" to author #5
// note: all isModified marks will be cleared after save()
var_export($book->getIsModified('author_id')); // --> false
var_export($book->getModified('author_id')); // --> null

// 4. reset modified marks
$book = new Book;
$book->author_id = 1;
$book->title = 'Tom Soyer';
var_export($book->getIsModified('author_id')); // --> true
var_export($book->getIsModified('title')); // --> true
$book->resetModified('author_id'); // forget about modified author_id
var_export($book->getIsModified('author_id')); // --> false
var_export($book->getModified('author_id')); // --> null

$book->resetModified(); // forget about any modified attribute
var_export($book->getIsModified()); // --> false
var_export($book->getModified('author_id')); // --> null
var_export($book->getModified('title')); // --> null

Resources

1 0
2 followers
140 downloads
Yii Version: 1.1
License: MIT
Category: Database
Developed by: copist
Created on: Aug 19, 2014
Last updated: 9 years ago

Downloads

show all

Related Extensions