Читайте также:
|
|
В реляционном запросе именованные группы условий могут быть использованы двумя способами. Их можно применить к основной модели и к связанным моделям.
Следующий код иллюстрирует случай их применения к основной модели:
$posts=Post::model()->published()->recently()->with('comments')->findAll();
Данный код очень похож на нереляционный запрос. Единственное отличие состоит в том, что присутствует вызов with() после вызовов групп условий. Данный запрос вернёт недавно опубликованные записи вместе с комментариями к ним.
В следующем примере показано, как применить группы условий к связанным моделям:
$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 соответствует имени связи. recently и approved — именованные группы, описанные в модели Comment. Имя связи и группы условий разделяются двоеточием.
Вам может понадобится использовать вместо жадной выборку отложенную для связи с группой условий. Синтаксис для этого такой:
// имя связи comments повторяется два раза
$approvedComments = $post->comments('comments:approved');
Именованные группы могут быть использованы при описании связей модели в методе CActiveRecord::relations() в параметре with. В следующем примере при обращении к $user->posts вместе с публикациями будут получены все одобренные комментарии.
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 появилась возможность передавать параметры именованным группам условий связи. К примеру, если в Post есть именованная группа условий rated, принимающая минимальный рейтинг записи, использовать её в User можно следующим образом:
Примечание: до версии 1.1.7 именованные группы условий, применяемые к реляционным моделям, должны быть описаны в CActiveRecord::scopes. Поэтому они не могут быть параметризованы.
$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;
}
......
}
Дата добавления: 2015-09-10; просмотров: 82 | Поможем написать вашу работу | Нарушение авторских прав |