Nazwane podzbiory są bardzo przydatnym elementem przy częstym filtrowaniu danych z modelu. Używam ich do wyświetlania listy opublikowanych postów. Za każdym razem kiedy chcę pobrać konkretne wpisy z blogu wywołuję jedną metodę z mojego modelu. Poniżej kilka przykładów
// pobieramy listę wszystkich opublikowanych wpisów.
$posts_list = $posts->published()->findall();
...
// pobieramy listę wszystkich wpisów z ustawioną flagą autopublikacji,
// ale jeszcze nie opublikowanych na blogu.
$posts_autopublish = $posts->autopublish()->unpublished()->findall();
Ciekawą opcją jest możliwość przekazywania parametrów wyszukiwania do podzbiorów.
$recent_posts = Posts::model()->recent(5)->findall();
Metoda zwróci nam tylko ostanie 5 najnowszych postów. A poniżej jej kod:
public function recent($limit=3)
{
$this->getDbCriteria()->mergeWith(array(
'order'=>'create_time DESC',
'limit'=>$limit,
));
return $this;
}
Następujący kod definiuje dwa nazwane podzbiory, opublikowane oraz najnowsze w klasie modelu Post:
class Post extends CActiveRecord
{
public function scopes()
{
return array(
'published'=>array(
'condition'=>'status=1',
),
'recently'=>array(
'order'=>'create_time DESC',
'limit'=>5,
),
);
}
}