как вивести статьи по ключевому тегу

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
abn
Сообщения: 1
Зарегистрирован: 2018.11.05, 23:58

как вивести статьи по ключевому тегу

Сообщение abn »

Задача следующая.
нужно показать все статьи по тегу.
не знаю как взять данные из массива. в коде ниже есть запросы, как к объектам.
с actionCategory все понятно, а с actionTag нет(

DB:
DefaultController.php:

Код: Выделить всё

 
 // 
    public function actionCategory($id) {
        $query = Article::find()->where(['category_id' => $id, 'status' => '1']);
        $count = $query->count();
        $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->module->params['articlesOnPage']]);
        $articles = $query->offset($pagination->offset)
                ->limit($pagination->limit)
                ->all();

        return $this->render('category', [
                    'articles' => $articles,
                    'pagination' => $pagination,
        ]);
    }
 
     public function actionTag($name) {
        $tag = Tag::find()->where(['name' => $name])->one();
        $query = $tag->articles;

        $count = count($query);

        $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->module->params['articlesOnPage']]);
        $articles = $query->offset($pagination->offset)
                ->limit($pagination->limit)
                ->all();

        return $this->render('tag', [
                    'articles' => $articles,
                    'pagination' => $pagination,
        ]);
    }
models/Tag.php:

Код: Выделить всё

public function getArticles()
    {
        return $this->hasMany(Article::className(), ['id' => 'article_id'])
            ->viaTable('{{%article_tag}}', ['tag_id' => 'id']);
    }
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: как вивести статьи по ключевому тегу

Сообщение andku83 »

Первый вариант:

Код: Выделить всё

     public function actionTag($name) {
        $tag = Tag::find()->where(['name' => $name])->one();
        $query = $tag->getArticles();  // это все отличие от вашего варианта

        $count = $query->count();

        $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->module->params['articlesOnPage']]);
        $articles = $query->offset($pagination->offset)
                ->limit($pagination->limit)
                ->all();

        return $this->render('tag', [
                    'articles' => $articles,
                    'pagination' => $pagination,
        ]);
По тому что передается на render можно судить что сам Tag вам не нужен, тогда напрашивается немного другой подход:

Код: Выделить всё

     public function actionTag($name) {
        $query = Article::find()->alias('article')->distinct()
        	->joinWith(['tags tags'], false)
        	->andWhere(['tags.name' => $name, 'article.status' => '1']); // по тегу вам же все равно нужно выводить только АКТИВНЫЕ статьи?

        $count = $query->count();

        $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->module->params['articlesOnPage']]);
        $articles = $query->offset($pagination->offset)
                ->limit($pagination->limit)
                ->all();

        return $this->render('tag', [
                    'articles' => $articles,
                    'pagination' => $pagination,
        ]);
Ответить