Переписываю один проект на Yii2 и много чего хочется вынести в модели. Притом вынести так, чтобы модель отдавала некий набор данных (массив или dataProvider) а контрлллер не знал нчиего про это )
В общем пытаюсь написать токний контроллер и толстую модель и не понимаю как лучше сделать, мечусь между несколькими реализациями.
Вообще ткните пальцев самый классный пример реализации поиска, выборки и вывода записей из БД.
1. Использовать SearchModel и метод search() в котором возвращать dataProvider, а в контроллере передавать
$items = SearchModel->search();
2. Не использовать dataProvider в метод search а просто в контроллере писать что-то вроде
$items = SearchModel::fund()->limit(...)->offset(..)->all();
и тут же определять $pages и передавать все это в вью.
Как пример одного туториала:
function actionIndex()
{
$query = Article::find()->where(['status' => 1]);
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count()]);
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('index', [
'models' => $models,
'pages' => $pages,
]);
}
3. Смешать два варианта:
в модели сделать
public static function find()
{
return \Yii::createObject(SomeQuery::className(), [get_called_class()]);
}
Затем написать SomeQuery с методом, например,
public function byFilter( $params ) {
if ( $params ) {
foreach ( $params as $k => $v ) {
if( trim($v)!='') {
switch ( $k ) {
case 'user_id' : {
$this->andWhere(['user_id' => intval( $v )]);
} break;
......
}
Затем уже в контроллере просто вызывать
$query = SearchModel::find()->byFilter(\Yii::$app->request->queryParams)->all();
Не понимаю как лучше\правильнее\потом легче поддерживать. Хочется сделать универсально, чтобы при росте нагрузок и изменении прицнипа выборки из БД контроллер вообще бы не трогать, а менять и оптимизировать только модель.
Спасибо =)