country
中獲取國家數據並顯示出來的頁面。為了實現這個目標,你將會配置一個數據庫連接。創建一個活動記錄類,而且創建一個操作及一個視圖。
貫穿整個章節,你將會學到:
- 配置一個數據庫連接
- 定義一個活動記錄類
- 使用活動記錄從數據庫中查詢數據
- 以分頁方式在視圖中顯示數據
請注意,為了掌握本章你應該具備最主要的數據庫知識和使用經驗。尤其是應該知道怎樣創建數據庫,怎樣通過數據庫終端運行 SQL 語句。
准備數據庫
首先創建一個名為 yii2basic
的數據庫,應用將從這個數據庫中獲取數據。
你能夠創建 SQLite,MySQL,PostregSQL,MSSQL 或 Oracle 數據庫,Yii 內置多種數據庫支持。簡單起見后面的內容將以 MySQL 為例做演示。
然后在數據庫中創建一個名為 country
的表並插入簡單的數據。能夠運行以下的語句:
CREATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `Country` VALUES ('AU','Australia',18886000); INSERT INTO `Country` VALUES ('BR','Brazil',170115000); INSERT INTO `Country` VALUES ('CA','Canada',1147000); INSERT INTO `Country` VALUES ('CN','China',1277558000); INSERT INTO `Country` VALUES ('DE','Germany',82164700); INSERT INTO `Country` VALUES ('FR','France',59225700); INSERT INTO `Country` VALUES ('GB','United Kingdom',59623400); INSERT INTO `Country` VALUES ('IN','India',1013662000); INSERT INTO `Country` VALUES ('RU','Russia',146934000); INSERT INTO `Country` VALUES ('US','United States',278357000);
於是便有了一個名為 yii2basic
的數據庫,在這個數據庫中有一個包括三個字段的數據表 country
。表中有十行數據。
配置數據庫連接
開始之前,請確保你已經安裝了 PHP PDO 擴展和你所使用的數據庫的 PDO 驅動(比如 MySQL 的 pdo_mysql
)。對於使用關系型數據庫來講,這是基本要求。
驅動和擴展安裝可用后,打開 config/db.php
改動里面的配置參數相應你的數據庫配置。
該文件默認包括這些內容:
<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ];
config/db/php
是一個典型的基於文件的配置工具。這個文件配置了數據庫連接 [[yii\db\Connection]] 的創建和初始化參數。應用的 SQL 查詢正是基於這個數據庫。
上面配置的數據庫連接能夠在應用中通過 Yii::$app->db
訪問。
補充:config/db.php 將被包括在應用配置文件 config/web.php 中,后者指定了整個應用怎樣初始化。請參考配置章節了解很多其它信息。
創建活動記錄
創建一個繼承自活動記錄類的類 Country
。把它放在 models/Country.php
。去表示和獲取 country
表的數據。
<?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { }
這個
Country
類繼承自 [[yii\db\ActiveRecord]]。你不用在里面寫不論什么代碼。僅僅須要像如今這樣。Yii 就能依據類名去推測相應的數據表名。
補充:假設類名和數據表名不能直接相應,能夠重寫 [[yii\db\ActiveRecord::tableName()|tableName()]] 方法去顯式指定相關表名。
<?php use app\models\Country; // 獲取 country 表的全部行並以 name 排序 $countries = Country::find()->orderBy('name')->all(); // 獲取主鍵為 “US” 的行 $country = Country::findOne('US'); // 輸出 “United States” echo $country->name; // 改動 name 為 “U.S.A.” 並在數據庫中保存更改 $country->name = 'U.S.A.'; $country->save();
補充:活動記錄是面向對象、功能強大的訪問和操作數據庫數據的方式。你能夠在活動記錄章節了解很多其它信息。除此之外你還能夠使用還有一種更原生的稱做數據訪問對象的方法操作數據庫數據。
創建操作
為了向終於用戶顯示國家數據,你須要創建一個操作。相比之前小節掌握的在 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()
方法。去生成查詢語句並從 country
表中取回全部數據。為了限定每一個請求所返回的國家數量,查詢在 [[yii\data\Pagination]] 對象的幫助下進行分頁。
Pagination
對象的使命主要有兩點:
- 為 SQL 查詢語句設置
offset
和limit
從句,確保每一個請求僅僅需返回一頁數據(本例中每頁是 5 行)。 - 在視圖中顯示一個由頁碼列表組成的分頁器,這點將在后面的段落中解釋。
在代碼末尾,index
操作渲染一個名為 index
的視圖,並傳遞國家數據和分頁信息進去。
創建視圖
在 views
文件夾下先創建一個名為 country
的子文件夾。這個文件夾存儲全部由 country
控制器渲染的視圖。在 views/country
文件夾下創建一個名為 index.php
的視圖文件。內容例如以下:
<?php use yii\helpers\Html; use yii\widgets\LinkPager; ?> <h1>Countries</h1> <ul> <?php foreach ($countries as $country): ?
> <li> <?
= Html::encode("{$country->name} ({$country->code})") ?
>: <?
= $country->population ?
> </li> <?php endforeach; ?> </ul> <?= LinkPager::widget(['pagination' => $pagination]) ?
>
這個視圖包括兩部分用以顯示國家數據。第一部分遍歷國家數據並以無序 HTML 列表渲染出來。第二部分使用 [[yii\widgets\LinkPager]] 去渲染從操作中傳來的分頁信息。
小部件LinkPager
顯示一個分頁button的列表。
點擊不論什么一個button都會跳轉到相應的分頁。
嘗試下
瀏覽器訪問以下的 URL 看看是否能工作:
http://hostname/index.php?r=country/index
國家列表
首先你會看到顯示着五個國家的列表頁面。
在國家以下。你還會看到一個包括四個button的分頁器。
假設你點擊button “2”,將會跳轉到顯示另外五個國家的頁面,也就是第二頁記錄。假設觀察細致點你還會看到瀏覽器的 URL 變成了:
http://hostname/index.php?r=country/index&page=2
在這個場景里,[[yii\data\Pagination|Pagination]] 提供了為數據結果集分頁的全部功能:
- 首先 [[yii\data\Pagination|Pagination]] 把 SELECT 的子查詢
LIMIT 5 OFFSET 0
數據表示成第一頁。因此開頭的五條數據會被取出並顯示。 - 然后小部件 [[yii\widgets\LinkPager|LinkPager]] 使用 [[yii\data\Pagination::createUrl()|Pagination::createUrl()]] 方法生成的 URL 去渲染翻頁button。
URL 中包括必要的參數
page
才干查詢不同的頁面編號。 - 假設你點擊button “2”,將會發起一個路由為
country/index
的新請求。[[yii\data\Pagination|Pagination]] 接收到 URL 中的page
參數把當前的頁碼設為 2。新的數據庫請求將會以
LIMIT 5 OFFSET 5
查詢並顯示。
總結
本章節中你學到了怎樣使用數據庫。
你還學到了怎樣取出並使用 [[yii\data\Pagination]] 和 [[yii\widgets\LinkPager]] 顯示數據。
下一章中你會學到怎樣使用 Yii 中強大的代碼生成器 Gii,去幫助你實現一些經常使用的功能需求,比如增查改刪(CRUD)數據表中的數據。
其實你之前所寫的代碼所有都能夠由 Gii 自己主動生成。