首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1 PHP语言发展历史及其适合的应用领域
1.2 什么是框架
1.3 为什么要用框架开发
1.4 自定义框架
1.4.1 MVC框架模式的实现
1.4.2 入口文件
1.4.3 应用(前端控制器)
1.4.4 从自定义框架到Yii2框架
2.1 Yii简介
2.1.1 什么是Yii框架技术
2.1.2 Yii2的优点
2.1.3 应用案例
2.2 下载Yii2
2.3 运行应用
2.4 输出“Hello World”
2.5 入口文件
2.6 应用主体
2.7 MVC框架模式
2.8 Yii2框架中的控制器
2.9 Yii2框架中的视图
2.10 项目实现迭代一:渲染首页、列表页和内容页视图
3.1 布局概述
3.2 项目实现迭代二:创建并使用布局渲染首页视图
3.3 Controller类的render()方法执行流程
3.4 应用级布局
3.5 嵌套布局
3.6 项目实现迭代三:使用嵌套布局渲染“新闻中心”列表页
3.7 视图文件的存储路径
4.1 模块概述
4.2 使用Gii创建模块
4.3 模块中的资源文件
4.4 项目实现迭代四:文章管理
5.1 ActiveRecord模型概述
5.2 通过CRUD(增查改删)操作理解ActiveRecord类
5.2.1 文章表(ds_article)
5.2.2 在配置文件中初始化数据库连接
5.2.3 创建ActiveRecord模型
5.2.4 通过查询操作理解ActiveRecord类
5.2.5 通过插入和更新操作理解ActiveRecord类
5.2.6 通过删除操作理解ActiveRecord类
5.3 项目实现迭代五:首页“行业百科”数据查询
5.4 项目实现迭代六:在“文章添加”页面实现数据插入
6.1 ActiveRecord模型类的find()方法与查询执行流程
6.2 查询方法find()实例
6.2.1 实现带有逻辑运算符和比较运算符的查询
6.2.2 实现范围比较查询
6.2.3 实现模糊查询
6.3 查询构建类ActiveQuery
6.3.1 ActiveQuery成员属性简介
6.3.2 ActiveQuery成员方法简介
6.3.3 Query类where()成员方法简介
6.4 关联查询
6.5 项目实现迭代七:完成首页中的数据填充
6.5.1 实现幻灯片切换
6.5.2 实现成功案例
6.5.3 实现其他栏目的文章内容查询
当前位置:
首页>>
技术小册>>
Yii2框架从入门到精通(上)
小册名称:Yii2框架从入门到精通(上)
### 6.5.3 实现其他栏目的文章内容查询 在Yii2框架中,构建一个多栏目内容管理系统(CMS)时,实现不同栏目下文章内容的查询是一个核心功能。这不仅能提升用户体验,还能帮助内容创作者有效管理和分类他们的作品。本章节将详细探讨如何在Yii2项目中实现其他栏目的文章内容查询,包括数据库设计、模型建立、控制器编写、视图展示以及使用ActiveQuery进行高级查询技巧。 #### 6.5.3.1 数据库设计 首先,我们需要设计一个能够支持多栏目的数据库结构。一般而言,至少需要以下几个表: 1. **articles**(文章表):存储文章的基本信息,如ID、标题、内容、发布时间等。 2. **categories**(栏目表):存储栏目的基本信息,如ID、名称、描述等。 3. **article_category**(文章与栏目关联表):存储文章与栏目之间的多对多关系,通常包含文章ID和栏目ID。 **articles 表结构示例**: ```sql CREATE TABLE `articles` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `title` VARCHAR(255) NOT NULL, `content` TEXT NOT NULL, `publish_time` DATETIME NOT NULL, ... ); ``` **categories 表结构示例**: ```sql CREATE TABLE `categories` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `description` TEXT, ... ); ``` **article_category 表结构示例**: ```sql CREATE TABLE `article_category` ( `article_id` INT, `category_id` INT, PRIMARY KEY (`article_id`, `category_id`), FOREIGN KEY (`article_id`) REFERENCES `articles`(`id`), FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ); ``` #### 6.5.3.2 模型建立 在Yii2中,每个数据库表通常对应一个模型(Model)。我们将创建`Article`, `Category`, 和一个`ArticleCategory`(如果需要处理复杂的关联逻辑,可能不需要单独的模型,直接使用关系定义在`Article`和`Category`模型中即可)。 **Article.php 示例**: ```php namespace app\models; use Yii; use yii\db\ActiveRecord; class Article extends ActiveRecord { public function getCategories() { return $this->hasMany(Category::className(), ['id' => 'category_id']) ->viaTable('article_category', ['article_id' => 'id']); } // ... 其他方法 } ``` **Category.php 示例**: ```php namespace app\models; use Yii; use yii\db\ActiveRecord; class Category extends ActiveRecord { public function getArticles() { return $this->hasMany(Article::className(), ['id' => 'article_id']) ->viaTable('article_category', ['category_id' => 'id']); } // ... 其他方法 } ``` #### 6.5.3.3 控制器编写 在控制器中,我们需要编写方法来处理文章查询请求,并根据栏目ID筛选出相应栏目的文章。 **ArticleController.php 示例**: ```php namespace app\controllers; use Yii; use yii\web\Controller; use app\models\Article; use app\models\Category; class ArticleController extends Controller { public function actionIndex($categoryId = null) { $query = Article::find(); if ($categoryId) { $category = Category::findOne(['id' => $categoryId]); if ($category) { $query->innerJoinWith(['categories' => function ($query) use ($category) { $query->andWhere(['category.id' => $category->id]); }]); } else { // 处理类别ID不存在的情况 Yii::$app->session->setFlash('error', 'Category not found.'); return $this->redirect(['index']); } } $articles = $query->all(); return $this->render('index', [ 'articles' => $articles, 'categoryId' => $categoryId, ]); } // ... 其他方法 } ``` #### 6.5.3.4 视图展示 在视图中,我们需要根据控制器传递的数据渲染出文章列表,并可能包括一些导航或筛选元素以支持用户访问不同栏目。 **views/article/index.php 示例**: ```php <?php use yii\helpers\Html; /* @var $this yii\web\View */ /* @var $articles app\models\Article[] */ /* @var $categoryId integer|null */ ?> <h1><?= Html::encode($this->title) ?></h1> <?php if ($categoryId): ?> <p>当前栏目: <?= Html::encode(Category::findOne($categoryId)->name) ?></p> <?php endif; ?> <ul> <?php foreach ($articles as $article): ?> <li><?= Html::a(Html::encode($article->title), ['view', 'id' => $article->id]) ?></li> <?php endforeach; ?> </ul> <?php if ($categories = Category::find()->all()): ?> <div> <h2>浏览其他栏目:</h2> <ul> <?php foreach ($categories as $category): ?> <li><?= Html::a(Html::encode($category->name), ['index', 'categoryId' => $category->id]) ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> ``` #### 6.5.3.5 使用ActiveQuery进行高级查询 Yii2的ActiveQuery提供了丰富的接口来进行复杂的数据查询。在上述例子中,我们已经使用了`innerJoinWith`来连接文章和栏目表,并基于栏目ID进行筛选。但ActiveQuery的能力远不止于此,你还可以使用`where()`, `orderBy()`, `groupBy()`, `limit()`, `offset()`等方法来进一步定制你的查询。 例如,如果你想要查询某个栏目下点击量最高的前10篇文章,你可以这样做: ```php $query = Article::find() ->innerJoinWith(['categories' => function ($query) use ($categoryId) { $query->andWhere(['category.id' => $categoryId]); }]) ->orderBy(['views' => SORT_DESC]) // 假设文章表有views字段表示点击量 ->limit(10); $topArticles = $query->all(); ``` #### 结论 通过本章的学习,我们了解了如何在Yii2框架中实现多栏目文章内容的查询功能。从数据库设计到模型建立,再到控制器编写和视图展示,每一步都至关重要。此外,我们还探讨了如何使用ActiveQuery进行高级查询,以满足更复杂的业务需求。掌握这些技能将帮助你构建出更加灵活和强大的内容管理系统。
上一篇:
6.5.2 实现成功案例
该分类下的相关小册推荐:
Swoole高性能框架-SwooleWorker
PHP合辑1-基础入门
PHP8入门与项目实战(8)
PHP8实战小册
PHP高性能框架-Swoole
Magento2主题开发高级实战
Laravel(10.x)从入门到精通(十四)
Laravel(10.x)从入门到精通(六)
Laravel(10.x)从入门到精通(七)
Laravel(10.x)从入门到精通(十七)
Magento零基础到架构师(产品管理)
Laravel(10.x)从入门到精通(一)