后端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),仅供参考
