В моем проекте Yii2 У меня есть posts
таблицы, связанной с categories
таблице как многие-ко-многим соотношение (posts_categories
таблица). В моей модели Post
у меня есть функция getByCategory($category_id)
, которая возвращает все сообщения категории. В контроллере у меня есть actionCategory
, где я использую эту функцию и передаю все сообщения для определенной категории. У меня также есть форма GET в представлении для фильтрации моих сообщений через параметр GET (мне нужно, чтобы это значение содержалось в заголовке или содержании показанных сообщений). Проблема в том, что у меня нет идеи, как применить функцию фильтра к моему вызову getByCategory в контроллере умным способом. Мой код функции:данные Yii2 фильтрации в запросах
public static function getPostsByCategory($category_id = null)
{
$posts = Post::find()
->select('posts.*')
->innerJoin('posts_categories', '`posts`.`id` = `posts_categories`.`post_id`')
->where(['posts_categories.category_id' => $category_id])
->orderBy(['date_create' => SORT_DESC])
->all();
return $posts;
}
контроллер действия:
public function actionCategory($id)
{
$posts = Post::getPostsByCategory($id);
return $this->render('index', array('all_posts' => $posts));
}
Все мои идеи, как, используя такие заявления «если $ _GET не пусто - использовать один запрос - если пусто - еще один» в контроллере или в модели выглядит грязно и приводит к дублированию кода в других действиях, где мне также понадобится моя фильтрация $ _GET. Не могли бы вы посоветовать что-нибудь? Благодарю.
это возвращает ActiveDataProvider, верно? Что делать, если я должен отображать его не в GridView или ListView? Спасибо –
Да, но если вы работаете с большими наборами данных, лучше всего использовать ActiveDataProvider. Я обновил свой ответ. – Vitaly