Именованные группы условий


Именованные группы условий задаются в методу scopes()

class Post extends CActiveRecord
{

    public function scopes()
    {
        return array(
            'published'=>array(
                'condition'=>'status=1',
            ),
            'recently'=>array(
                'order'=>'create_time DESC',
                'limit'=>5,
            ),
        );
    }
}

А вызываются через модель

$posts=Post::model()->published()->recently()->findAll();

Именованные группы условий можно "осложнить" параметрами

public function recently($limit=5)
{
    $this->getDbCriteria()->mergeWith(array(
        'order'=>'create_time DESC',
        'limit'=>$limit,
    ));
    return $this;
}

$posts=Post::model()->published()->recently(3)->findAll();

Полезно также задать условие по умолчанию для всех Post::model()->findAll()

class Content extends CActiveRecord
{
    public function defaultScope()
    {
        return array(
            'condition'=>"language='".Yii::app()->language."'",
        );
    }
}

Можно также сделать унивесальную группу в поведении, которую можно применять к разным объектам:

public function published($val = true)
{
    $val = (int)$val;
    $owner=$this->getOwner();
    $criteria=$owner->getDbCriteria();
    $alias=$owner->getTableAlias();

    $criteria->mergeWith(array(
        'condition'=>$alias.'.published='.$val,
    ));

    return $owner;
}