Yii 2 实战:从数据库连接到 Active Record 分页国家列表(pais 表示例全流程)
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇指南基于 Yii 2 框架本仓库即 Yii 2 官方源码带领你从零搭建一个国家数据列表页面先准备pais数据库表再配置yii\db\Connection数据库连接创建 Active Record 模型与控制器 action最后用yii\data\Pagination与yii\widgets\LinkPager实现分页展示。读完本文你将完整掌握 Yii 2 中配置连接 → 定义模型 → 查询数据 → 分页渲染的标准数据库开发链路并理解每一步背后的框架源码实现。前置知识与本教程目标本教程假设你已经具备数据库基础知识知道如何创建数据库、如何用数据库客户端执行 SQL 语句。通过本教程你将学会配置一个数据库连接DB Connection定义一个 Active Record 类使用 Active Record 类查询数据在视图中以分页方式展示数据。文中示例以 MySQL 为例Yii 2 内建支持 SQLite、MySQL、PostgreSQL、MSSQL、Oracle 等多种数据库数据库访问对象DAO 章节有更完整的说明。InfoMariaDB 曾是 MySQL 的无缝替代品但如今已不完全成立。若你需要在 MariaDB 中使用JSON等高级特性请查阅下文提到的 MariaDB 扩展。准备数据库创建yii2basico库与pais表首先创建一个名为yii2basico的数据库这是应用取数的数据源。接着在其中创建pais表并插入示例数据可直接执行以下 SQLCREATE TABLE pais ( codigo CHAR(2) NOT NULL PRIMARY KEY, nome CHAR(52) NOT NULL, populacao INT(11) NOT NULL DEFAULT 0 ) ENGINEInnoDB DEFAULT CHARSETutf8; INSERT INTO pais VALUES (AU,Austrália,24016400); INSERT INTO pais VALUES (BR,Brasil,205722000); INSERT INTO pais VALUES (CA,Canadá,35985751); INSERT INTO pais VALUES (CN,China,1375210000); INSERT INTO pais VALUES (DE,Alemanha,81459000); INSERT INTO pais VALUES (FR,França,64513242); INSERT INTO pais VALUES (GB,Reino Unido,65097000); INSERT INTO pais VALUES (IN,Índia,1285400000); INSERT INTO pais VALUES (RU,Rússia,146519759); INSERT INTO pais VALUES (US,Estados Unidos,322976000);此时你拥有一个名为yii2basico的数据库内含三列codigo、nome、populacao、十行数据的pais表。主键codigo是两位国家代码这为后续findOne()按主键查询提供了天然示例。配置数据库连接config/db.php与yii\db\Connection前置依赖继续之前请确认已安装 PHP 的 PDO 扩展以及所用数据库对应的 PDO 驱动例如 MySQL 的pdo_mysql。这是使用关系型数据库的基本要求。默认配置文件打开config/db.php按你的数据库环境修改参数。默认内容如下?php return [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnameyii2basico, username root, password , charset utf8, ];config/db.php是一个典型的基于文件的配置工具它指定了创建并初始化yii\db\Connection实例所需的参数应用通过该实例对底层数据库执行 SQL 查询。配置完成后即可在代码中通过Yii::$app-db访问这个连接。Infoconfig/db.php会被主应用配置config/web.php引入include后者定义了应用实例如何初始化。详见配置章节。源码视角Connection 的关键属性从本仓库源码 framework/db/Connection.php 可以看到上表各配置项对应Connection的公开属性$dsnPDO 数据源名称。注意 SQLite 可使用路径别名例如sqlite:app/data/db.sql见 Connection.php$username/$password默认null表示不携带用户名/密码$charset仅对 MySQL、PostgreSQL、CUBRID 生效Oracle 必须在 DSN 中追加;charsetUTF-8若在 MySQL 中使用 GBK/BIG5 字符集官方强烈建议直接在 DSN 里指定charset$tablePrefix表名前缀配合 AR 类名中的{{%表名}}占位符使用默认为空$emulatePrepare是否开启 PDO 预处理模拟某些数据库如 MySQL的原生 prepare 存在缺陷时可设为true绕过$enableSchemaCache/$enableQueryCache等缓存属性分别控制表结构元数据缓存与查询结果缓存默认查询缓存开启enableQueryCache true默认时长 3600 秒。非内建数据库的支持如需使用 Yii 未内建支持的数据库可查阅对应的官方社区扩展Informix、IBM DB2、Firebird 以及 MariaDB处理 JSON 等高级特性时尤其需要。这些扩展可通过 Yii 官方扩展目录搜索获取。创建 Active Record 模型Pais类为表示并查询pais表的数据创建一个继承自 Active Record 的类Pais保存为models/Pais.php?php namespace app\models; use yii\db\ActiveRecord; class Pais extends ActiveRecord { }Pais继承自yii\db\ActiveRecord你甚至不需要在类里写任何代码仅凭上述代码Yii 就会根据类名自动推断关联的表名。Info如果类名无法与表名直接对应可以重写yii\db\ActiveRecord::tableName()方法显式指定表名。源码视角表名推断规则tableName()的默认实现在 framework/db/ActiveRecord.php它使用Inflector::camel2id()将类名转换为蛇形命名并套上{{%...}}占位符——%会被Connection::$tablePrefix替换。例如tablePrefix tbl_时类Customer对应tbl_customerOrderItem对应tbl_order_item。这也是为什么Pais类无需任何代码即可命中pais表。使用 Pais 类操作数据借助Pais类你可以轻松操作pais表中的数据例如use app\models\Pais; // 获取 pais 表全部行并按 nome 排序 $paises Pais::find()-orderBy(nome)-all(); // 获取主键为 BR 的行 $pais Pais::findOne(BR); // 输出 Brasil echo $pais-nome; // 将国家名改为 Brazil 并保存到数据库 $pais-nome Brazil; $pais-save();find()的实现在 framework/db/ActiveRecord.php它通过Yii::createObject()基于调用类创建一个ActiveQuery实例这正是查询构建器链式调用find()-orderBy()-all()的起点。InfoActive Record 是以面向对象方式访问和操作数据库数据的强大工具更详细的说明见 Active Record 章节。你也可以改用底层的数据访问方式——数据库访问对象DAO 来与数据库交互。创建 ActionPaisController与分页查询为了把国家数据暴露给终端用户需要创建一个新 action。与其像之前章节那样把 action 放进site控制器更合理的做法是新建一个专门承载国家数据相关 action 的控制器。将其命名为PaisController并在其中创建indexaction?php namespace app\controllers; use yii\web\Controller; use yii\data\Pagination; use app\models\Pais; class PaisController extends Controller { public function actionIndex() { $query Pais::find(); $paginacao new Pagination([ defaultPageSize 5, totalCount $query-count(), ]); $paises $query-orderBy(nome) -offset($paginacao-offset) -limit($paginacao-limit) -all(); return $this-render(index, [ paises $paises, paginacao $paginacao, ]); } }将以上代码保存为controllers/PaisController.php。indexaction 首先调用Pais::find()——这个 Active Record 方法会构建一条针对pais表的数据库查询。为了限制每次请求返回的国家数量查询借助yii\data\Pagination对象进行分页。Pagination对象承担两个职责为查询所代表的 SQL 语句设置offset与limit子句使其每次只返回一页数据本例每页最多 5 行供视图展示由一列页码按钮组成的分页器下一小节详述。最后indexaction 渲染名为index的视图并把国家数据与分页信息传递给它。源码视角Pagination 的工作机制分页器定义于 framework/data/Pagination.php几个关键属性决定了分页行为pageParam pageURL 中承载页码的参数名即访问第 2 页时 URL 里的page2pageSizeParam per-page每页条数参数名可与defaultPageSize配合让用户自定义每页条数defaultPageSize 20默认每页条数本例显式设为 5pageSizeLimit [1, 50]每页条数的上下限防止恶意传参见 getPageSize/setPageSizetotalCount总记录数用于计算总页数pageCount(totalCount pageSize - 1) / pageSize向上取整见 getPageCountvalidatePage true页码越界校验当请求页超出范围时自动收敛到最后一页见 setPage。getOffset()返回当前页 × 每页条数Pagination.phpgetLimit()返回每页条数Pagination.php——二者被直接用于ActiveQuery::offset()/limit()最终生成LIMIT 5 OFFSET 0、LIMIT 5 OFFSET 5之类的 SQL。而分页链接则由createUrl()Pagination.php基于当前请求路由与查询参数生成。上述行为均有对应的单元测试覆盖可参阅 tests/framework/data/PaginationTest.php含testCreateUrl、testValidatePage、testGetOffset、testGetLimit等用例。创建 Viewviews/pais/index.php与 LinkPager在views目录下先创建子目录pais用于存放PaisController渲染的所有视图。然后在views/pais目录下创建index.php文件?php use yii\helpers\Html; use yii\widgets\LinkPager; ? h1Países/h1 ul ?php foreach ($paises as $pais): ? li ? Html::encode({$pais-nome} ({$pais-codigo})) ?: ? $pais-populacao ? /li ?php endforeach; ? /ul ? LinkPager::widget([pagination $paginacao]) ?视图包含两个展示国家数据的部分第一部分遍历传入的国家数据渲染为无序 HTML 列表其中Html::encode()对所有输出做 HTML 转义是 Yii 2 防 XSS 的标配做法第二部分使用 action 传入的分页信息渲染yii\widgets\LinkPager小组件widget它输出一列页码按钮点击任意按钮即刷新对应页的国家数据。LinkPager的实现位于 framework/widgets/LinkPager.php其按钮 URL 正是由上文提到的Pagination::createUrl()生成。运行验证访问分页列表打开浏览器访问以下 URL 验证效果https://hostname/index.php?rpais/index初始你会看到一页 5 个国家国家列表下方是含 4 个按钮的分页器。点击按钮 2 后页面显示数据库中另外 5 个国家即第二页记录同时浏览器 URL 变为https://hostname/index.php?rpais/indexpage2幕后机制yii\data\Pagination在后台提供了分页所需的全部能力初始时Pagination表示第一页对应的国家查询为LIMIT 5 OFFSET 0因此取出并展示前 5 个国家yii\widgets\LinkPager小组件使用Pagination::createUrl()生成的 URL 渲染页码按钮URL 中携带表示不同页码的page参数点击页码按钮 2 会触发一次针对路由pais/index的新请求。Pagination从 URL 读取page参数并把当前页码设为 2此时国家查询变为LIMIT 5 OFFSET 5返回接下来的 5 个国家用于展示。总结与下一步在本节中你学会了如何与数据库协同工作配置yii\db\Connection连接、定义PaisActive Record 模型、用模型查询数据并借助yii\data\Pagination与yii\widgets\LinkPager实现数据的分页获取与分页展示。下一节你将学习如何使用强大的代码生成工具 Gii参见 Gii 使用指南快速实现常见功能例如针对数据表的增删改查CRUD。事实上你刚刚手写的全部代码都可以用 Gii 自动生成。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 数据库实战从连接配置到 Active Record 分页列表Country 示例全流程Yii 2 数据库实战从连接配置到 Active Record 分页列表Country 示例全流程 导读 本文基于 Yii 2 官方入门指南中的“数据库”后端Web框架Yii 2 数据库实战指南从连接配置到 Active Record 分页展示以 country 表示例Yii 2 数据库实战指南从连接配置到 Active Record 分页展示以 country 表示例 本篇技术指南以 Yii 2 框架的数据库开发为核心后端Web框架Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面 本指南以 Yii 2 框架当前仓库 yi/yii2 https://l后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考