06. Yii 2.0 数据库交互

来源:互联网 发布:手机音乐后期软件 编辑:程序博客网 时间:2024/06/05 09:06
DAO(Data Access Objects 数据库访问对象)
Yii 包含了一个建立在 PHP PDO 之上的数据访问层 (DAO)。DAO为不同的数据库提供了一套统一的API。

示例:
以 Yii 2.0 基础版为例,高级版类似。
首先,在 basic 目录下新建一个文件夹 entity,然后在 basic/entity 目录下新建 basicUser.php 文件,里面封装了对 basic_user 表的 CURD 操作(增、删、改、查),内容如下:
  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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
<?php
namespace app\entity;
class BasicUser {
const TABLE_NAME = 'basic_user';
/**
* 新增记录
*/
public function add(){
/* // 通过原生的sql语句的方式
$db = \Yii::$app->db; // 实例化一个db组件
$sql = 'INSERT '.self::TABLE_NAME.'(username,passwd) VALUES("jack","123456")';
$command = $db->createCommand($sql);
$command->execute(); // 执行sql语句,返回值为受影响的行数
return $db->lastInsertID; // 获取新增记录的主键id */
/* // 通过面向对象编程的方式
$res = \Yii::$app->db->createCommand()
->insert(self::TABLE_NAME, array('username'=>'rose', 'passwd'=>'888888'))
->execute(); // 新增操作,返回的是受影响的行数
return \Yii::$app->db->lastInsertID; */
// 同时插入多条记录
// INSERT table_name(columns) VALUES(val1),(val2)
$res = \Yii::$app->db->createCommand()
->batchInsert(self::TABLE_NAME, array('username','passwd'), array(array('user1','111111'), array('user2','222222')))
->execute();
return \Yii::$app->db->lastInsertID; // 注意这里返回的是批量插入的第一条记录的主键id
}
/**
* 删除记录
*/
public function del(){
$res = \Yii::$app->db->createCommand()
->delete(self::TABLE_NAME, ['id'=>3])
->execute(); // 删除操作,返回的是受影响的行数
return $res;
}
/**
* 更新记录
*/
public function update(){
$res = \Yii::$app->db->createCommand()
->update(self::TABLE_NAME, ['username'=>'newuser'], ['id'=>2])
->execute(); // 更改操作,返回的是受影响的行数
return $res;
}
/**
* 查询多条记录(查询操作是增、删、改、查中,最为复杂的操作)
*/
public function query(){
$sql = 'SELECT * FROM '.self::TABLE_NAME;
$res = \Yii::$app->db->createCommand($sql)
->queryAll(); // 返回二维数组
return $res;
}
/**
* 查询单条记录
*/
public function getUserInfo($username){
/* // 这种sql语句的写法不安全,容易引起sql注入
$sql = 'SELECT * FROM '.self::TABLE_NAME.' WHERE username="'.$username.'"';
$res = \Yii::$app->db->createCommand($sql)
->queryOne(); // 返回一维数组
return $res; */
// 使用参数绑定,php的pdo扩展支持参数绑定的形式来书写sql,可预防sql注入
$sql = 'SELECT * FROM '.self::TABLE_NAME.' WHERE username=:uname'; // 使用占位符 :uname
$res = \Yii::$app->db->createCommand($sql)
->bindValues(array(':uname'=>$username)) // 参数绑定
->queryOne(); // 返回一维数组
return $res;
// 增、删、改、查操作,都可以使用参数绑定的方式,防止sql注入
}
/**
* 事务的操作
*/
public function trans(){
$db = \Yii::$app->db;
$trans = $db->beginTransaction();
try {
//...
$trans->commit();
return true;
} catch (\Exception $e) {
$trans->rollBack();
return false;
}
}
}
 来自CODE的代码片
snippet_file_0.php
然后,修改数据库配置文件 basic/config/db.php,如下:
 1 2 3 4 5 6 7 8 9
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
 来自CODE的代码片
snippet_file_0.php
再在MySQL数据库中新建一个数据库 test,创建数据表 basic_user,包含字段id、username、passwd。

最后,在 basic/controllers 目录下新建一个控制器 TestController.php,内容如下:
  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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
<?php
namespace app\controllers;
use yii\web\Controller;
use app\entity\BasicUser;
class TestController extends Controller {
/**
* 新增记录
*/
public function actionAdd(){
$res = (new BasicUser())->add();
var_dump($res);
}
/**
* 删除记录
*/
public function actionDel(){
$res = (new BasicUser())->del();
var_dump($res);
}
/**
* 编辑记录
*/
public function actionEdit(){
$res = (new BasicUser())->update();
var_dump($res);
}
/**
* 查询多条记录
*/
public function actionQuery(){
$res = (new BasicUser())->query();
echo json_encode($res);
}
/**
* 查询单个用户信息
*/
public function actionGetInfo(){
$res = (new BasicUser())->getUserInfo('jack');
var_dump($res);
}
}
 来自CODE的代码片
snippet_file_0.php
在浏览器地址栏分别访问以下地址,查看对应的效果:
http://basic.com/test/add
http://basic.com/test/del
http://basic.com/test/edit
http://basic.com/test/query
http://basic.com/test/get-info