恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Yii 2 数据库入门实战:Active Record、Pagination 与 LinkPager 构建国家列表页面
首页
资讯中心
/
Yii 2 数据库入门实战:Active Record、Pagination 与 LinkPager 构建国家列表页面
Yii 2 数据库入门实战:Active Record、Pagination 与 LinkPager 构建国家列表页面
发布时间:2026/9/24 6:47:55
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇技术指南以 Yii 2 官方入门教程的数据库章节俄语版 start-databases.md为骨架带你在一个 Yii 2 应用中从零搭建国家列表页面配置数据库连接、创建 Active Record 模型、编写控制器动作并使用Pagination与LinkPager实现分页展示。读完本文你将掌握 Yii 2 中最核心的数据库访问与数据展示链路并了解yii\db\Connection、yii\db\ActiveRecord、yii\data\Pagination、yii\widgets\LinkPager在框架源码中的真实行为。前置准备你会用到的基础知识学习本指南前你需要具备基础的数据库使用能力知道如何创建数据库、能使用数据库客户端执行 SQL 语句。本指南最终会创建一个显示countries表数据的网页整个过程涉及四个环节配置数据库连接config/db.php创建 Active Record 类模型层定义控制器动作action控制层创建视图并用分页展示数据视图层。这一流程完整覆盖了 Yii 2 中模型—控制器—视图MVC与数据库交互的最小闭环也是后续学习 Gii 代码生成器 的基础——实际上下面手写的代码在 Yii 中完全可以由 Gii 自动生成。准备数据库创建yii2basic库与country表首先创建名为yii2basic的数据库应用将从中读取数据。Yii 内置了对多种数据库的支持包括 SQLite、MySQL、PostgreSQL、MSSQL 和 Oracle为便于讲解本指南以 MySQL 为例。接着在数据库中创建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);执行后你就拥有了一个包含三列code、name、population、十行数据的country表。其中code是两字符主键population默认值为0。配置数据库连接认识config/db.php动手写代码之前请确认 PHP 已安装 PDO 扩展以及对应数据库的 PDO 驱动MySQL 对应pdo_mysql——这是 Yii 应用使用关系型数据库的基本前提。然后打开应用中的config/db.php文件该文件位于 Yii 2 应用模板内即 basic/advanced 模板约定路径本仓库不含应用模板只含框架源码将其参数改为你实际的数据库信息。默认内容如下?php return [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnameyii2basic, username root, password , charset utf8, ];这是一个典型的基于文件的配置工具它返回一个数组指定了创建并初始化yii\db\Connection实例所需的全部参数。从源码看Connection.php 中这些属性都有明确的定义与默认语义dsn第 167 行数据源名称必填格式为驱动:host主机;dbname库名username第 171 行、password第 175 行连接凭据默认为null表示不使用charset第 253 行连接字符集应用模板默认utf8tablePrefix第 267 行表前缀默认为空字符串与 Active Record 的{{%表名}}占位符配合使用。配置完成后整个应用可以通过Yii::$app-db访问该连接对象并向对应数据库发起 SQL 查询。Infoconfig/db.php会被主配置config/web.php引入后者描述了应用实例如何初始化。详细机制可参考配置章节。如果你的数据库不在框架内置支持范围内可以关注社区扩展例如 Informix、IBM DB2、Firebird 等数据库的第三方连接扩展可通过 Composer 检索相应包。创建 Active Record 模型models/Country.php为了表示并读取country表的数据创建一个继承自 Active Record 的Country类保存于应用目录models/Country.php?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { }类体可以是空的Country继承自yii\db\ActiveRecordYii 会自动把类名与表名对应起来。默认规则见 ActiveRecord.php 中tableName()的实现public static function tableName() { return {{% . Inflector::camel2id(StringHelper::basename(get_called_class()), _) . }}; }即把类名从驼峰式转成下划线式Country→country。如果类名与表名无法直接对应你可以覆写tableName()方法显式返回关联的表名。有了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();InfoActive Record 是以面向对象风格访问和操作数据库数据的强大方式详见 Active Record 章节。若需要更底层的数据库访问可以使用 Data Access ObjectsDAO。创建控制器与动作分页查询country数据为了把国家数据显示给最终用户需要新建一个动作。与其像前几节那样继续塞进site控制器不如为所有与国家数据相关的动作专门建一个控制器。新建CountryController并在其中创建index动作?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。index动作调用了Country::find()——该 Active Record 方法会构建一个数据库查询读取country表的全部数据。为了让每次查询只返回一部分国家查询通过yii\data\Pagination对象进行分页。Pagination对象承担两个职责为查询设置 SQL 的offset与limit子句让每条 SQL 语句每次只返回一页数据本例每页最多 5 行供视图用于渲染由页码按钮组成的分页器详见下一节。从源码看 Pagination.php 的默认行为pageParam page页码参数名、defaultPageSize 20默认页大小、pageSizeLimit [1, 50]页大小上下限、forcePageParam true、validatePage true。在本例中显式传入defaultPageSize 5覆盖了默认的 20。查询链路的底层实现也值得注意totalCount来自$query-count()在 Query.php 中它通过queryScalar(COUNT($q))生成聚合查询得到记录总数offset()与limit()定义于 QueryTrait.php分别设置查询的 OFFSET 和 LIMIT 部分并返回查询对象本身链式调用getPageCount()Pagination.php按(totalCount pageSize - 1) / pageSize向上取整计算总页数——十行数据、每页 5 条正好 2 页getPage()第 170-178 行从查询参数page读取当前页号从 1 开始内部换算为零基索引并通过setPage()做越界校验保证页号落在合法区间内。动作末尾渲染名为index的视图把国家数据连同分页信息一并传入。创建视图用 LinkPager 渲染分页导航首先在views目录下创建子目录country用于存放country控制器的所有视图。在views/country中创建index.php代码如下?php use yii\helpers\Html; use yii\widgets\LinkPager; ? h1Countries/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()转义避免 XSS 风险第二部分利用从动作传入的分页信息渲染yii\widgets\LinkPager小部件。LinkPager会生成一组页码按钮点击任意按钮即可切换到对应页的数据。从源码看 LinkPager.php它必须设置pagination属性才能工作第 38 行默认渲染容器 CSS 类为pagination第 43 行并且maxButtonCount默认最多显示 10 个页码按钮第 96 行。它还提供了丰富的定制点firstPageCssClass、lastPageCssClass、prevPageCssClass、nextPageCssClass、activePageCssClass当前页高亮默认active、disabledPageCssClass等方便与 Bootstrap 等 CSS 框架配合。注意LinkPager 只生成必要的 HTML 标记要让分页器真正好看需要配套 CSS 样式。实战测试分页如何工作在浏览器中访问以下地址即可看到完整效果https://hostname/index.php?rcountry%2Findex首次打开时页面会显示 5 个国家下方是分页器按钮。点击按钮 2 后会看到数据库中另外 5 个国家第二页记录。仔细观察会发现浏览器地址栏也变成了https://hostname/index.php?rcountry%2Findexpage2幕后Pagination提供了分页所需的全部功能初始状态下Pagination展示第一页对应执行SELECT ... LIMIT 5 OFFSET 0返回并显示前 5 个国家LinkPager使用Pagination::createUrl()生成的 URL 渲染页码按钮这些 URL 包含表示页码的page查询参数正是 Pagination.php 中pageParam page的体现点击按钮 2 后浏览器发起新的country/index请求查询变为LIMIT 5 OFFSET 5返回接下来的 5 个国家。这里能看到框架的一个设计细节默认forcePageParam true意味着即使在第一页URL 中也会保留page参数若希望首页 URL 更干净可将其设为false当页码为 0 时 URL 中不输出page参数。小结与下一步在本节中你学会了配置数据库连接、定义 Active Record 模型、用 Active Record 查询数据以及在视图中借助Pagination与LinkPager分页展示数据。下一节将学习强大的代码生成工具 Gii用它快速实现常见的数据库表增删改查CRUD功能。事实上你刚刚手写的这套代码在 Yii 中完全可以由 Gii 自动生成——理解本文的每一步将帮助你更好地理解和使用 Gii 的输出。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面 本指南以 Yii 2 框架当前仓库 yi/yii2 https://l后端Web框架Yii 2 数据库入门实战连接配置、Active Record 模型与分页列表页构建Yii 2 数据库入门实战连接配置、Active Record 模型与分页列表页构建 本篇技术指南基于 Yii 2 官方入门教程对应仓库 docs/guid后端Web框架Yii 2 实战从数据库连接到 Active Record 分页国家列表pais 表示例全流程Yii 2 实战从数据库连接到 Active Record 分页国家列表pais 表示例全流程 本篇指南基于 Yii 2 框架本仓库即 Yii 2 官方后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考