Yii学习笔记(二)
数据库的使用
Yii 内置多种数据库支持,如: SQLite,MySQL,PostregSQL,MSSQL 或 Oracle 数据库。
创建数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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); |
配置数据库连接
需要确保已经安装了 PHP PDO
扩展和你所使用的数据库的 PDO 驱动
(例如 MySQL 的 pdo_mysql
)
编辑 config/db.php
配置文件,来修改相应的配置信息。而这个数据库
1 2 3 4 5 6 7 8 9 10 |
<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]; |
创建活动记录
创建 models/Country.php
文件,文件内容:
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { } |
Country 类只需继承 yii\db\ActiveRecord
,Yii 就能根据类名去猜测对应的数据表名。如果类名和数据表名不能直接对应,可以覆写 yii\db\ActiveRecord::tableName()
方法去显式指定相关表名。
操作表数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
,保存在controllers/CountryController.php
中,并在其中创建一个 index 操作,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?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, ]); } } |
创建视图
在 views 目录下先创建一个名为 country
的子目录。
这个目录存储所有由 country 控制器
渲染的视图。 在 views/country
目录下创建一个名为 index.php
的视图文件, 内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?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]) ?> |
yii\data\Pagination
接收到 URL 中的 page 参数把当前的页码设为 2。 新的数据库请求将会以 LIMIT 5 OFFSET 5
查询并显示。