Yii2數據庫分頁操作方法介紹


本章節將介紹怎樣怎樣創建一個從數據表  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 自己主動生成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM