Yii2 使用数据库总结(一)

首先,我们要进行数据库连接的配置:
打开 config/db.php 修改里面的配置参数对应你的数据库配置。
<?php

return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
上面配置的数据库连接可以在应用中通过 Yii::$app->db 访问。 
接下来就是两种访问数据库的方式:
 
一、通过活动记录,操作数据库
 
Active Record (活动记录,以下简称AR)提供了一个面向对象的接口, 用以访问数据库中的数据。一个 AR 类关联一张数据表, 每个 AR 对象对应表中的一行,对象的属性(即 AR 的特性Attribute)映射到数据行的对应列。  您可以直接以面向对象的方式来操纵数据表中的数据。
 
例如,可以通过下面的语句,插入一条新的记录了:
$customer = new Customer();
$customer->name = 'Qiang';
$customer->save(); // 一行新数据插入 customer 表
上面的代码和使用下面的原生 SQL 语句是等效的,但显然前者更直观, 更不易出错,并且面对不同的数据库系统(DBMS, Database Management System)时更不容易产生兼容性问题。
$db->createCommand('INSERT INTO customer (name) VALUES (:name)', [
':name' => 'Qiang',
])->execute();
活动记录方式的使用步骤:
1、创建一个继承自活动记录类的类 Customer,类继承自 [[yiidbActiveRecord]],这样,Yii就能够根据类名去猜测对应的表名,把它放在 models/Customer.php,去表示和获取 customer表的数据。
(PS:如果类名和数据表名不能直接对应,可以重写 [[yiidbActiveRecord::tableName()|tableName()]] 方法去显式指定相关表名。)
<?php

namespace appmodels;

use yiidbActiveRecord;

class Customer extends ActiveRecord
{
}
然后,就可以对customer表进行相应的操作了,如下:
use appmodelsCustomer;

// 获取 customer 表的所有行并以 name 排序
$customers = Customer::find()->orderBy('name')->all();

// 获取主键为 “郑凯” 的行
$customer = Customer::findOne('郑凯');

// 输出 “郑凯”
echo $customer->name;

// 修改 name 为 “zhengkai” 并在数据库中保存更改
$customer->name = 'zhengkai';
$customer->save();
活动记录是面向对象、功能强大的访问和操作数据库数据的方式。
除了这种方式之外,你还可以使用另一种相对比较原生的称做数据访问对象的方法操作数据库数据。接下来看第二种!
 
二、Query Builder(查询构建器)
 
查询构建器建立在 Database Access Objects 基础之上,可让你创建 程序化的、DBMS无关的SQL语句。相比于原生的SQL语句,查询构建器可以帮你 写出可读性更强的SQL相关的代码,并生成安全性更强的SQL语句。
 
使用查询构建器通常包含以下两个步骤:
  1. 创建一个 yii\db\Query 对象来代表一条 SELECT SQL 语句的不同子句(例如 SELECT, FROM)。
  2. 执行 yii\db\Query 的一个查询方法(例如:all())从数据库当中检索数据。


如下所示代码是查询构造器的一个典型用法:
$rows = (new \yii\db\Query())
->select(['id', 'email'])
->from('user')
->where(['last_name' => 'Smith'])
->limit(10)
->all();
SELECT `id`, `email` 
FROM `user`
WHERE `last_name` = :last_name
LIMIT 10
上面的操作等同于对应的SQL语句。
 
三、createCommand 直接执行SQL
 
Class yii\db\Connection 下的一个public方法,使用方法如下:
 
查询:
Yii::app()->db->createCommand($sql)->queryAll(); //查询所有行数据
Yii::app()->db->createCommand($sql)->queryRow(); //查询第一行数据
Yii::app()->db->createCommand($sql)->queryColumn(); //查询第一列数据
Yii::app()->db->createCommand($sql)->queryScalar(); //查询第一行的第一字段
执行:
Yii::app()->db->createCommand($sql)->execute(); //创建、更新、删除,的执行
插入:
$result = Yii::app()->db->createCommand()->insert('table表名',
array(
'column1' => $value1,
'column2' => $value2,
'column3' =>$value3,
'create_time' => time(),
)
);

//获取插入id号:
Yii::app()->db->getLastInsertID()
更新:
​$result = Yii::app()->db->createCommand()->update('table表名', 
array(
'column1' => $value1,
'column2' => $value2,
'column3' =>$value3,
'update_time' => time(),
),
"id=:id", array(':id' => $id)
);
删除:
$result = Yii::app()->db->createCommand()->delete('table表名',
"id=:id", array(':id' => $id)
);
其他:
单表查询
$goodsTypes = Yii::app()->db->createCommand()
->select('type_id, type_name')
->from('goods_type')
->where('status=1')
->queryAll();
连表查询
$goods = Yii::app()->db->createCommand()
->from('goods g')
->select('g.good_id, g.good_name, gt.type_name, g.price, g.buy_nums, g.commit_nums, g.create_time')
->join('goods_type gt', 'g.good_type=gt.type_id')
->where('g.`status`=1 and gt.`status`=1')
->order('g.create_time desc')
->queryAll();
可用的方法如下


->select(): SELECT子句  
->selectDistinct(): SELECT子句,并保持了记录的唯一性  
->from():         构建FROM子句  
->where():        构建WHERE子句  
->join():         在FROM子句中构建INNER JOIN 子句  
->leftJoin():     在FROM子句中构建左连接子句  
->rightJoin():    在FROM子句中构建右连接子句  
->crossJoin():    添加交叉查询片段(没用过)  
->naturalJoin():  添加一个自然连接子片段  
->group():        GROUP BY子句  
->having():       类似于WHERE的子句,但要与GROUP BY连用  
->order():        ORDER BY子句  
->limit():        LIMIT子句的第一部分  
->offset():       LIMIT子句的第二部分  
->union():        appends a UNION query fragment


 
参考资料:
     https://my.oschina.net/lnmpstudy/blog/421146
     http://blog.csdn.net/liruxing1 ... 68953
     http://blog.sina.com.cn/s/blog ... .html
已邀请:

要回复问题请先登录注册