
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇技术指南基于 Yii 2 官方入门教程对应仓库 docs/guide-uk/start-databases.md 章节完整演示如何在一个 Yii 2 应用中从零搭建“国家数据列表”页面包括准备数据库与示例数据、配置数据库连接、定义 Active Record 模型、编写控制器动作并通过PaginationLinkPager实现分页展示。读完本文你将掌握 Yii 2 数据库访问的核心链路Connection→ActiveRecord→ActiveQuery→ 视图分页并能在自己的项目中直接复刻这套“配置—建模—动作—视图”的典型开发流程。前置准备与环境要求在开始之前你需要具备基本的数据库使用经验尤其是以下两点能力会创建数据库能够使用数据库客户端工具执行 SQL 语句。此外Yii 2 访问关系型数据库依赖 PHP 的PDO扩展以及对应数据库的 PDO 驱动。例如使用 MySQL 时需要启用pdo_mysql驱动。这是所有使用关系型数据库的 Yii 应用的基本前提。若缺失对应扩展yii\db\Connection在打开连接时会直接失败。第一步准备数据库与示例数据按教程约定先创建一个名为yii2basic的数据库后续所有示例数据都从该库中读取。Yii 2 对多种数据库提供内置支持包括 SQLite、MySQL、PostgreSQL、MSSQL 和 Oracle见 framework/db/Connection.php 中$schemaMap对pgsql、mysql、sqlite、sqlsrv、oci、mssql、dblib等驱动的映射为便于叙述本文按 MySQL 展开。在yii2basic库中创建country表并插入十条示例数据可直接执行以下 SQLCREATE 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、一张包含三列code、name、population的country表以及表内十条数据。code列被设为主键这在后续findOne(US)按主键查询时会直接发挥作用。提示官方英文版教程补充提醒MariaDB 曾长期作为 MySQL 的直接替代品但这已不完全成立若需使用 MariaDB 的高级特性如 JSON 支持应选用对应的专用扩展。第二步配置数据库连接编写 config/db.php打开应用的config/db.php文件将其调整为与你的数据库匹配的参数。默认内容如下?php return [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnameyii2basic, username root, password , charset utf8, ];这是一个典型的基于文件的 配置 写法它描述了创建并初始化一个[[yii\db\Connection]]实例所需的全部参数。通过这个连接实例你可以对底层数据库执行 SQL 查询。各配置项含义如下配置项说明class组件类名固定为yii\db\Connection即 framework/db/Connection.php 中定义的数据库连接类dsnPDO 数据源名称格式为驱动:host主机;dbname库名换用其他数据库时对应改写例如 SQLite 为sqlite:/path/to/db.sqlite、PostgreSQL 为pgsql:hostlocalhost;port5432;dbnameyii2basicusername/password数据库账号与密码默认root与空密码生产环境务必替换charset连接字符集默认utf8从 framework/db/Connection.php 源码可以看到$dsn、$username、$password、$charset均为该类的公开属性此外该类还支持$tablePrefix表前缀配合{{%表名}}占位符使用例如{{%post}}在tablePrefix tbl_时会解析为{{tbl_post}}、$attributes连接建立时设置的 PDO 属性、$emulatePrepare等高级配置。调用open()时若$dsn为空会抛出InvalidConfigException提示Connection::dsn cannot be empty.因此dsn是必填项。连接在应用中的使用方式上面配置好的连接在应用代码中通过Yii::$app-db即可访问。例如$connection Yii::$app-db;Infoconfig/db.php会被主应用配置文件config/web.php引入后者决定了 应用 实例如何初始化。也就是说db是应用内置的数据库组件Yii::$app-db返回的正是通过该配置文件创建的单例连接。关于文件级配置的更多细节可阅读 配置 章节。第三步创建 Active Record 模型Country 类Active Record 是 Yii 2 面向对象地访问与操作数据库数据的核心手段。要为country表建模只需在models/Country.php中创建继承自 Active Record 的Country类?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { }注意类体内不需要写任何代码。Yii 会自动从类名推断关联的数据表名。表名推断的底层原理从源码看framework/db/ActiveRecord.php 中的默认tableName()实现为public static function tableName() { return {{% . Inflector::camel2id(StringHelper::basename(get_called_class()), _) . }}; }即取类名去掉命名空间后的短名如Country通过Inflector::camel2id()转换为下划线风格的小写形式如Country→country、OrderItem→order_item再套上{{%...}}表前缀占位符。因此类名Country对应表country无需额外声明。Info当类名无法与表名直接对应时例如表名是countries或带前缀可以重写tableName()方法显式指定例如return countries;。getTableSchema()在找不到对应表时会抛出InvalidConfigException提示The table does not exist: ...这有助于及早发现表名拼写错误。通过 Active Record 操作数据有了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();其中Country::find()返回一个ActiveQuery查询对象见 framework/db/ActiveRecord.php 中find()的实现return Yii::createObject(ActiveQuery::className(), [get_called_class()]);可通过orderBy()、where()、limit()、offset()等链式方法组装查询条件findOne()的实现位于 framework/db/BaseActiveRecord.phpreturn static::findByCondition($condition)-one();当传入标量时按主键查询当传入数组时按条件查询。修改属性后调用save()即可将变更写回数据库。InfoActive Record 是访问和操作数据库数据的强大方式更深入的内容见 Active Record 章节。如果希望使用更底层的数据访问方式可参考 Database Access ObjectsDAO。第四步创建控制器动作为了让最终用户看到国家数据需要新建一个动作。与之前章节把动作放进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。这段动作代码的核心逻辑是Country::find()创建一个查询对象用于访问country表的数据通过$query-count()获得记录总数并用它实例化[[yii\data\Pagination]]对象设置每页5条Pagination对象承担两个职责为 SQL 语句设置offset与limit使查询一次只返回一页数据每页最多 5 行为视图提供分页信息用于渲染由一系列页码按钮组成的分页器下一节详述$query-orderBy(name)-offset(...)-limit(...)-all()执行查询并返回当前页记录render(index, [...])渲染名为index的视图并把国家数据与分页信息一并传入。Pagination 的底层机制[[yii\data\Pagination]]定义在 framework/data/Pagination.php几个关键默认值值得留意属性默认值说明$pageParampageURL 中表示页码的查询参数名$pageSizeParamper-pageURL 中表示每页条数的查询参数名$defaultPageSize20默认每页条数本例显式覆盖为 5$pageSizeLimit[1, 50]每页条数的合法范围超出会被钳制$forcePageParamtrue是否始终在 URL 中携带页码参数getOffset()的实现为$this-getPage() * $pageSizegetLimit()返回当前页大小若页大小小于 1 则返回 -1表示不分页取全部数据getPage()内部通过getQueryParam($this-pageParam, 1) - 1从请求参数中读取页码createUrl()则基于当前请求参数生成带page参数的翻页 URL这些方法共同构成了分页的完整闭环。第五步创建视图在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-name} ({$country-code})) ?: ? $country-population ? /li ?php endforeach; ? /ul ? LinkPager::widget([pagination $pagination]) ?该视图包含两个区块第一部分遍历从动作传入的$countries将每条国家数据渲染为 HTML 无序列表项。借助Html::encode()对输出内容做 HTML 编码可有效防止 XSS 注入——这是 Yii 视图输出的安全基线实践。第二部分使用[[yii\widgets\LinkPager]]组件渲染分页器。LinkPager依据传入的$pagination信息输出一列页码按钮点击任一按钮即会刷新对应页的国家数据。LinkPager 组件LinkPager定义在 framework/widgets/LinkPager.php其可配置项包括$pagination必填Pagination实例提供总页数、当前页等数据$maxButtonCount 10最多显示的页码按钮数$nextPageLabel raquo;、$prevPageLabel laquo;下一页/上一页按钮的标签$firstPageLabel false、$lastPageLabel false首页/末页按钮默认不显示$hideOnSinglePage true当只有一页时自动隐藏分页器$options [class pagination]容器标签的 HTML 属性。例如想开启首页/末页按钮可写成LinkPager::widget([pagination $pagination, firstPageLabel true, lastPageLabel true])。第六步运行验证打开浏览器访问以下 URLhttps://hostname/index.php?rcountry%2Findex该截图来自本仓库官方指南的 docs/guide-uk/images/start-country-list.png展示了运行后的国家列表与分页按钮效果。首次打开时页面会显示前五个国家下方是包含四个页码按钮的分页器。点击按钮“2”页面将展示数据库中接下来的五个国家即第二条记录页。同时观察浏览器地址栏URL 会变为https://hostname/index.php?rcountry%2Findexpage2分页在幕后如何工作[[yii\data\Pagination]]为数据分页提供了全部必要能力其工作过程如下初始状态Pagination表示第一页对应的国家查询 SQL 为SELECT ... LIMIT 5 OFFSET 0因此返回并展示最先找到的五个国家生成翻页链接LinkPager组件使用Pagination::createUrl()生成各页码按钮的 URL这些 URL 携带page查询参数分别代表不同的页码翻页请求点击按钮“2”后浏览器向路由country/index发起新请求Pagination从 URL 读取page参数并把当前页设为第 2 页于是新的数据库查询变为LIMIT 5 OFFSET 5返回接下来的五个国家用于展示。由此可见Pagination与LinkPager的分工非常清晰前者负责“计算”——确定当前页、总页数、offset与limit以及翻页 URL后者负责“呈现”——把页码渲染成可点击的按钮列表。总结与延伸在本节中你完成了 Yii 2 数据库访问的完整实践创建数据库与示例表并用config/db.php配置yii\db\Connection连接通过继承yii\db\ActiveRecord的Country类以面向对象方式查询与修改数据在CountryController::actionIndex()中结合Pagination实现数据分页在views/country/index.php中通过LinkPager渲染分页器向用户展示带翻页的国家列表。这套“配置连接 → 定义模型 → 编写动作 → 渲染视图”的流程是 Yii 2 中一切数据驱动页面的通用骨架。若需更深一步可阅读 Active Record 与 Database Access ObjectsDAO 章节掌握数据访问全貌而下一步教程将介绍强大的代码生成工具 Gii——事实上本节手写的模型、控制器与视图代码都可以通过 Gii 自动生成包括针对数据表的增删改查CRUD操作。赞分享后端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 框架本仓库 framework/ 目录为框架源码为基础后端Web框架Yii 2 数据库实战入门从连接配置到 Active Record 分页展示Yii 2 数据库实战入门从连接配置到 Active Record 分页展示 本教程对应官方指南 Working with Databases 的波兰语译版后端Web框架Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面Yii 2 数据库入门实战用 Active Record 与分页组件构建国家列表页面 本指南以 Yii 2 框架当前仓库 yi/yii2 https://l后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考