首页/新闻资讯/正文详情

Yii 2 入门实战:从零构建基于数据库的分页国家列表页面(Active Record + Pagination 全流程)

发布时间:2026/9/23 23:55:52 来源:云帆数科 栏目:资讯中心
Yii 2 入门实战:从零构建基于数据库的分页国家列表页面(Active Record + Pagination 全流程)
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇技术指南围绕 Yii 2 框架入门教程中的“处理数据库データベースを扱う”一节展开逐步演示如何创建一个从名为country的数据库表读取国别数据、并以分页形式展示的新页面。读者将完整掌握四件事配置数据库连接、定义 Active Record 模型类、通过 Active Record 查询数据、借助Pagination与LinkPager在视图中分页展示数据。文中所有结论均以本仓库gh_mirrors/yi/yii2中的框架源码与官方文档为依据可直接对照 docs/guide-ja/start-databases.md英文原版见 docs/guide/start-databases.md进行验证。开始之前请确认你具备使用数据库的基础知识能够用 DB 客户端工具创建数据库、执行 SQL 语句否则建议先复习相关基础再继续。准备数据库创建yii2basic库与country表首先创建一个名为yii2basic的数据库应用的数据将从这个库中读取。Yii 内建支持多种数据库产品你可以选择 SQLite、MySQL、PostgreSQL、MSSQL 或 Oracle 中的任意一种来创建数据库。为了简化叙述本文以 MySQL 为前提。提示MariaDB 曾经是 MySQL 的无缝替代品但现在情况已不完全如此。若需在 MariaDB 中使用JSON支持这类高级特性请考虑使用后文列出的 MariaDB 扩展。接着在数据库中创建名为country的表并插入示例数据直接执行以下 SQL 即可CREATE TABLE country ( code CHAR(2) NOT NULL PRIMARY KEY, name CHAR(52) NOT NULL, population INT(11) NOT NULL DEFAULT 0 ) ENGINEInnoDB DEFAULT CHARSETutf8; INSERT INTO country VALUES (AU,Australia,24016400); INSERT INTO country VALUES (BR,Brazil,205722000); INSERT INTO country VALUES (CA,Canada,35985751); INSERT INTO country VALUES (CN,China,1375210000); INSERT INTO country VALUES (DE,Germany,81459000); INSERT INTO country VALUES (FR,France,64513242); INSERT INTO country VALUES (GB,United Kingdom,65097000); INSERT INTO country VALUES (IN,India,1285400000); INSERT INTO country VALUES (RU,Russia,146519759); INSERT INTO country VALUES (US,United States,322976000);完成这一步后你将拥有一个名为yii2basic的数据库其中包含三列、十行数据的country表共 10 个国家/地区记录正好可以演示 5 条一页的分页效果。配置 DB 连接理解config/db.php与yii\db\Connection在继续之前请确保已经安装 PHP 的 PDO 扩展以及你所使用数据库对应的 PDO 驱动例如 MySQL 需要pdo_mysql。应用只要使用关系型数据库这就是基本前提。安装完成后打开config/db.php文件按你的数据库实际情况修改参数。该文件默认内容如下?php return [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnameyii2basic, username root, password , charset utf8, ];config/db.php是典型的基于文件的配置工具。这份配置指定了创建并初始化一个yii\db\Connection实例所需的参数通过该实例即可对底层数据库执行 SQL 查询。从框架源码看yii\db\Connection位于 framework/db/Connection.php它本质上是对 PDO 的一层薄封装与Command、DataReader、Transaction协同提供统一的数据访问 API见该类头部注释framework/db/Connection.php#L18-L28。值得留意的是Connection还支持数据库复制与读写分离可以配置多个masters和slaves自动做负载均衡与故障切换并把读操作导向从库、写操作导向主库——这是生产环境优化读写性能的重要能力。就本教程而言我们只需单库配置即可。配置完成后应用代码中可以通过Yii::$app-db表达式访问该 DB 连接。提示config/db.php会被主应用配置文件config/web.php引入而config/web.php决定了应用实例如何初始化。更详细的信息请参考配置一节。如果你的数据库不在 Yii 内建支持之列可以考虑以下扩展Informix 支持扩展edgardmessias/yii2-informixIBM DB2 支持扩展edgardmessias/yii2-ibm-db2Firebird 支持扩展edgardmessias/yii2-firebirdMariaDB 支持扩展sam-it/yii2-mariadb创建 Active Record空类Country与表名推断机制为了表示并获取country表中的数据创建一个继承自 Active Record 的Country类保存到models/Country.php文件?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { }Country类继承了yii\db\ActiveRecord内部完全不需要写任何代码。仅凭上述代码Yii 就会从类名推断出关联的表名。这个推断逻辑在 framework/db/ActiveRecord.php#L421-L424 的tableName()方法中实现默认使用Inflector::camel2id()将类名转为蛇形命名并套用Connection::tablePrefix前缀若配置了tbl_前缀Customer会变成tbl_customer、OrderItem变成tbl_order_item。例如本教程的Country类会自动关联country表。提示如果类名与表名无法直接对应可以覆写tableName()方法显式指定关联的表名对应源码注释见 framework/db/ActiveRecord.php#L413-L420。有了Country类操作country表的数据就变得非常简单例如use app\models\Country; // 从 country 表取出所有行并按 name 排序 $countries Country::find()-orderBy(name)-all(); // 取出主键为 US 的那一行 $country Country::findOne(US); // 显示 United States echo $country-name; // 把国名改为 U.S.A. 并保存到数据库 $country-name U.S.A.; $country-save();提示Active Record 是以面向对象方式访问和操作数据库数据的强大手段更详细的资料见 Active Record 一节。此外也可以使用更低层的数据访问方式——数据库访问对象Database Access Objects——来操作数据库。创建 ActionCountryController与Pagination分页查询为了把国别数据开放给终端用户需要创建新的 action。与之前章节把 action 放在site控制器中不同更合理的做法是新建一个专门承载国别数据相关 action 的控制器。将这个新控制器命名为CountryController并在其中创建indexaction?php namespace app\controllers; use yii\web\Controller; use yii\data\Pagination; use app\models\Country; class CountryController extends Controller { public function actionIndex() { $query Country::find(); $pagination new Pagination([ defaultPageSize 5, totalCount $query-count(), ]); $countries $query-orderBy(name) -offset($pagination-offset) -limit($pagination-limit) -all(); return $this-render(index, [ countries $countries, pagination $pagination, ]); } }将上述代码保存到controllers/CountryController.php文件。整个流程可以拆解如下indexaction 首先调用Country::find()。该方法返回一个ActiveQuery查询对象提供从country表取数的方法对应源码见 framework/db/ActiveRecord.php#L408-L411find()通过Yii::createObject()创建ActiveQuery实例。为了限制每次请求返回的国家数量查询对象借助yii\data\Pagination对象进行分页。Pagination对象承担两个职责为查询对象所代表的 SQL 语句设置offset与limit子句使每次只返回一页数据本页最多 5 行供视图渲染由一系列页码按钮组成的分页器下一节详述。随后all()方法根据查询结果返回所有country记录。代码末尾indexaction 渲染名为index的视图并把返回的国别数据与分页信息一并传给视图。从源码层面看yii\data\Pagination位于 framework/data/Pagination.php它通过属性驱动整个分页机制其中与本例直接相关的关键点包括defaultPageSize每页默认条目数源码默认值为 20framework/data/Pagination.php#L134本例显式设为 5。totalCount数据总条目数这里通过$query-count()取得。pageParam表示当前页码的查询参数名默认是pageframework/data/Pagination.php#L87即 URL 中的?page2就来源于此。pageSizeParam表示每页条数的查询参数名默认per-pageframework/data/Pagination.php#L92。pageSizeLimit页码尺寸允许的上下限[1, 50]framework/data/Pagination.php#L139用于防止用户通过 URL 传入超范围值。getOffset()返回当前页号 × 每页条数framework/data/Pagination.php#L293-L298getLimit()返回每页条数framework/data/Pagination.php#L305-L310二者正是喂给查询对象offset()/limit()的值。getPageCount()按(totalCount pageSize - 1) / pageSize向上取整计算总页数framework/data/Pagination.php#L151-L16110 条数据每页 5 条正好得到 4 页。createUrl()负责生成指向指定页码的 URLframework/data/Pagination.php#L259-L287页码加 1 后写入page参数由LinkPager用于渲染按钮链接。创建 Viewviews/country/index.php与LinkPager分页器首先在views目录下创建名为country的子目录该目录用于存放country控制器渲染的所有视图。然后在views/country目录中创建index.php文件内容如下?php use yii\helpers\Html; use yii\widgets\LinkPager; ? h1国リスト/h1 ul ?php foreach ($countries as $country): ? li ? Html::encode({$country-code} ({$country-name})) ?: ? $country-population ? /li ?php endforeach; ? /ul ? LinkPager::widget([pagination $pagination]) ?视图按展示国别数据的目的分为两部分第一部分遍历传入的国别数据渲染为 HTML 无序列表。注意这里使用了Html::encode()对code、name进行 HTML 转义这是防止 XSS 注入的安全实践。第二部分使用 action 传入的分页信息渲染yii\widgets\LinkPager小部件。LinkPager会显示一串页码按钮点击任一按钮即可刷新并展示对应页的国别数据。LinkPager位于 framework/widgets/LinkPager.php它只生成必要的 HTML 标记列表形式的ul classpagination需要配合 CSS默认配置下使用 Twitter Bootstrap CSS 效果最佳才能呈现为美观的分页条。其可配置属性包括pagination必须设置即与之关联的Pagination对象framework/widgets/LinkPager.php#L34-L38。maxButtonCount最多显示多少个页码按钮默认 10framework/widgets/LinkPager.php#L96。hideOnSinglePage只有一页数据时是否隐藏分页器默认trueframework/widgets/LinkPager.php#L129。options分页器容器标签的 HTML 属性默认[class pagination]framework/widgets/LinkPager.php#L43。上一页/下一页按钮标签prevPageLabel/nextPageLabel默认laquo;/raquo;、首页/末页按钮firstPageLabel/lastPageLabel默认false即不显示等均可按需定制framework/widgets/LinkPager.php#L98-L118。运行验证观察分页 URL 变化与Pagination的幕后机制要查看以上所有代码的运行效果在浏览器中访问以下 URLhttps://hostname/index.php?rcountry%2Findex截图来自 docs/guide-ja/images/start-country-list.png即本教程运行结果的实拍截图。初始时页面显示 5 个国家国别列表下方是带 4 个按钮的分页器。点击按钮 “2” 后页面会显示数据库中的下 5 个国家即第二页记录。仔细观察会发现浏览器 URL 也发生了变化https://hostname/index.php?rcountry%2Findexpage2在幕后yii\data\Pagination提供了分页数据所需的全部功能初始状态Pagination表示第一页对应的SELECT查询带有LIMIT 5 OFFSET 0子句因此取回并显示前 5 个国家。按钮渲染LinkPager小部件使用Pagination::createUrl()生成的 URL 渲染页码按钮这些 URL 包含表示不同页码的page查询参数。翻页请求点击页码按钮 “2” 后会向路由country/index发起并处理新的请求。Pagination从 URL 读取page查询参数把当前页码设为 2注意源码中页码是零基的getPage()会把 URL 中的值减 1见 framework/data/Pagination.php#L170-L178。于是新的查询带有LIMIT 5 OFFSET 5子句返回接下来的 5 个国家用于展示。小结与下一步在本节中你学习了如何与数据库打交道并借助yii\data\Pagination与yii\widgets\LinkPager分页获取并展示数据。完整的实现链条为config/db.php配置yii\db\Connection→models/Country.php定义 Active Record 模型 →controllers/CountryController.php的actionIndex用Pagination分页查询 →views/country/index.php用LinkPager渲染分页按钮。下一步将学习名为 Gii 的强大的代码生成工具它能帮助你快速实现诸如针对数据库表数据的“增删改查CRUD”操作等常用功能。事实上你刚刚手写的这些代码全部都可以由 Yii 借助 Gii 工具自动生成。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 数据库入门实战Active Record、Pagination 与 LinkPager 构建国家列表页面Yii 2 数据库入门实战Active Record、Pagination 与 LinkPager 构建国家列表页面 本篇技术指南以 Yii 2 官方入门教程后端Web框架Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面 本指南以 Yii 2 框架当前仓库 yi/yii2 https://l后端Web框架Yii 2 实战从数据库连接到 Active Record 分页国家列表pais 表示例全流程Yii 2 实战从数据库连接到 Active Record 分页国家列表pais 表示例全流程 本篇指南基于 Yii 2 框架本仓库即 Yii 2 官方后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

EmDash 站点功能开发指南:站点设置、导航菜单、分类法、搜索、SEO 与页面注入全解析
EmDash 站点功能开发指南:站点设置、导航菜单、分类法、搜索、SEO 与页面注入全解析

CMS后端前端插件系统 【免费下载链接】emdash EmDash is a full-stack TypeScript CMS based on Astro; the spiritual successor to WordPress 项目地址: https://gitcode.com/gh_mirrors/emdas/emdash 点击查看 免费下载 导读 本文基于 EmDash 官方技能文档 sit… · 2026/9/23 23:55:45

PostGraphile V5 数据过滤完全指南:condition 参数、智能标签与 addPgTableCondition 高级筛选
PostGraphile V5 数据过滤完全指南:condition 参数、智能标签与 addPgTableCondition 高级筛选

后端API网关 【免费下载链接】crystal 🔮 Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more! 项目地址: https://gitcode.com/gh_mirrors/cry/crystal 点击查看 免费下载 导读:本文聚焦… · 2026/9/23 23:55:45

Agent Substrate 架构解析:面向百万级 Agent 沙箱的高密度挂起/恢复执行运行时
Agent Substrate 架构解析:面向百万级 Agent 沙箱的高密度挂起/恢复执行运行时

人工智能AI AgentAgent 沙箱云原生容器运行时零信任 【免费下载链接】substrate Agent Substrate: the core system 项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate 点击查看 免费下载 Agent Substrate(下称 Substrate&#xff0… · 2026/9/23 23:55:39

星月神产品质量怎么样,安防服务专业吗
星月神产品质量怎么样,安防服务专业吗

从新世纪之初到当下,中国房地产行业与装配式建筑产业历经了从高速扩张到高质量发展的深刻变迁,无数建材家居品牌在浪潮中起起落落,有人急功近利追求短期规模,有人沉下心打磨产品与服务。浙江星月安防科技有限公司从2001年成立至今… · 2026/9/24 0:40:47

PSO优化RBF神经网络:轻量级协同调参实战指南
PSO优化RBF神经网络:轻量级协同调参实战指南

简介:本资源是一个基于粒子群优化(PSO)算法实现RBF神经网络参数调优的轻量级Python实践项目,面向机器学习初学者与算法优化实践者,聚焦于非线性拟合与分类任务中RBF网络结构参数(如中心、宽度、权值&#x… · 2026/9/24 0:40:41

基于MediaPipe和OpenCV的手势识别与手指计数实战
基于MediaPipe和OpenCV的手势识别与手指计数实战

简介:基于Python语言,结合OpenCV与MediaPipe的手势识别及手指计数项目,面向需要完成计算机毕设或入门计算机视觉的开发者,提供可直接运行的完整代码与测试数据。资源包共5个文件,包含2个Python脚本、2个Markdown说明文… · 2026/9/24 0:40:34

深入解析 SpaceX-API v4 payloads 端点:载荷数据获取、字段模型与查询实践
深入解析 SpaceX-API v4 payloads 端点:载荷数据获取、字段模型与查询实践

后端API设计 【免费下载链接】SpaceX-API :rocket: Open Source REST API for SpaceX launch, rocket, core, capsule, starlink, launchpad, and landing pad data. 项目地址: https://gitcode.com/gh_mirrors/spa/SpaceX-API 点击查看 免费下载 导读 /v4/payloa… · 2026/9/24 0:40:16

攻克 mal 实现难点:Hints 指南中的时间戳、函数引用、I/O 与 Reader 设计
攻克 mal 实现难点:Hints 指南中的时间戳、函数引用、I/O 与 Reader 设计

示例工程 【免费下载链接】mal mal - Make a Lisp 项目地址: https://gitcode.com/gh_mirrors/ma/mal 点击查看 免费下载 mal(Make a Lisp)是一个用数十种语言逐步实现 Lisp 解释器的教学项目。在编写 step0 到 stepA 的过程中,实… · 2026/9/24 0:40:16

大数据入门学习顺序:Hadoop、Hive、Spark、Flink等九大组件最小链路搭建指南
大数据入门学习顺序:Hadoop、Hive、Spark、Flink等九大组件最小链路搭建指南

简介:这是一份面向大数据初学者与转行开发者的系统入门资料包,围绕Hadoop、Hive、Spark、Storm、Flink、HBase、Kafka、Zookeeper、Flume等主流组件展开,覆盖学习路线、技术栈思维导图、常用软件安装指南,以及环境搭建、命令实操、… · 2026/9/24 0:40:04

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码