This extension can decorate any ActiveRecord method which returns list of the ActiveRecord models and you can use collection as a single ActiveRecord model.
Requirements ¶
Yii 1.*
Installation ¶
using git: go to the application.ext directory and clone project ~~~ $> git clone git@github.com:oncesk/yii-active-collection-decorator.git ~~~
using archive: download archive and unpack it into application.ext directory, download extension
Yii configuration ¶
You can add extension into import section into your config/main.php file for class autoloading
return array(
  ...
  'import' => array(
    'ext.yii-active-collection-decorator.*'
  ),
  ...
);
Usage ¶
Override method which should return list of the ActiveRecord models such as findAll and etc..
Into your ActiveRecord model
/**
 * @property integer $id
 * @property integer $status
 * @property string $name
 * @property string $avatar
 */
class User extends CActiveRecord {
  const STATUS_ACTIVE = 1;
  const STATUS_DELETED = 2;
  ...
  public function findAll($condition = '', $params = array()) {
    return ActiveCollectionDecorator::createCollection($this, parent::findAll($condition, $params));
  }
  ...
  public function relations() {
    return array(
            'posts' => array(self::HAS_MANY, 'Post', 'user_id'),
        );
  }
}
And now you can
$userCollection = User::model()->findAll();
//  simple foreach
foreach ($userCollection as $user) {
  //  $user is a User model object
}
//  ArrayAccess interface
echo $userCollection[0]->id; //  get id of the first User model in the list of the models
//  fetch any attribute as array
print_r($userCollection->name); //  output: array(0 => 'John Smith', 1 => 'Sara Mitchel', ...)
//  you can set attribute value for all models
$userCollection->status = User::STATUS_DELETED;
//  you can save all models
$userCollection->save();
//  deletion
$userCollection->delete();  // all users will be deleted
//  you can get relations
print_r($userCollection->posts);  // in output you can see posts of every user
//  filter models
$newFilteredCollection = $userCollection->filter(function (User $user) {
    return $user->status == User::STATUS_ACTIVE;
}); // will be returned new collection which contains only models with active users
//  get attribute names
print_r($userCollection->attributeNames());
//  get relations
print_r($userCollection->relations());
//  call any method in the model
$stats = $userColletion->getStatistics(); // $stats - array of each model result
//  get first model, if elements count == 0 will be returned null
if ($first = $userCollection->first()) {
    echo $first->name;
}
//  get last model, if elements count == 0 will be returned null
if ($last = $userCollection->last()) {
    echo $last->name;
}
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.