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


С помощью with() можно прикручивать доп. сведения. Концепция:

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


Развитие концепции

$posts=Post::model()->with('comments:recently:approved')->findAll();

// или, начиная с версии 1.1.7
$posts=Post::model()->with(array(
    'comments'=>array(
        'scopes'=>array('recently','approved')
    ),
))->findAll();

// или, начиная с версии 1.1.7
$posts=Post::model()->findAll(array(
    'with'=>array(
        'comments'=>array(
            'scopes'=>array('recently','approved')
        ),
    ),
));

// имя связи comments повторяется два раза -
// вместо «жадной» выборки получается «отложенная»
$approvedComments = $post->comments('comments:approved');

Именованные группы могут быть использованы при описании связей модели

class User extends CActiveRecord
{
    public function relations()
    {
        return array(
            'posts'=>array(self::HAS_MANY, 'Post', 'author_id',
                'with'=>'comments:approved'),
        );
    }
}
// или, начиная с версии 1.1.7
class User extends CActiveRecord
{
    public function relations()
    {
        return array(
            'posts'=>array(self::HAS_MANY, 'Post', 'author_id',
                'with'=>array(
                    'comments'=>array(
                        'scopes'=>'approved'
                    ),
                ),
            ),
        );
    }
}

С версии 1.1.7 появилась возможность передавать параметры
именованным группам условий связи.

$users=User::model()->findAll(array(
    'with'=>array(
        'posts'=>array(
            'scopes'=>array(
                'rated'=>5,
            ),
        ),
    ),
));

class Post extends CActiveRecord
{

    public function rated($rating)
    {
        $this->getDbCriteria()->mergeWith(array(
            'condition'=>'rating=:rating',
            'params'=>array(':rating'=>$rating),
        ));
        return $this;
    }

}